IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Mouse_event x,y windows 7 64 bit


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 4
    Par défaut Mouse_event x,y windows 7 64 bit
    Bonjour,

    Je cherche à simuler des clics souris en dehors de mon programme et sans perturber/capturer/utiliser le curseur, j'ai vu plusieurs forums ou la question était posée et résolut en utilisant les paramètres x et y de la fonction mouse_event mais quand je fais tourner ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
        Public Const MOUSEEVENTF_LEFTDOWN As Integer = 2
        Public Const MOUSEEVENTF_LEFTUP As Integer = 4
        Public Const MOUSEEVENTF_RIGHTDOWN As Integer = 8
        Public Const MOUSEEVENTF_RIGHTUP As Integer = 16
        Public Declare Sub mouse_event Lib "user32.dll" (ByVal dwFlags As Integer, ByVal dx As Integer, ByVal dy As Integer, ByVal cButtons As Integer, ByVal dwExtraInfo As Integer)
     
        Public Sub Clic(ByVal p As Point)
            mouse_event(MOUSEEVENTF_LEFTDOWN, p.X, p.Y, 0, 0)
            mouse_event(MOUSEEVENTF_LEFTUP, p.X, p.Y, 0, 0)
        End Sub
    Sur mon windows 7 64 bit le clic se fait toujours sur la position du curseur..
    voilà, si quelqu'un a une idée de ce qui ne va pas ou une autre solution pour faire ça je suis preneur.

    merci d'avance =)

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Le paramètre dwExtraInfo devrait être de type UIntPtr, et non Integer
    De plus, si tu veux utiliser des coordonnées absolues, il faut passer le flag ABSOLUTE


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        Public Const MOUSEEVENTF_LEFTDOWN As Integer = 2
        Public Const MOUSEEVENTF_LEFTUP As Integer = 4
        Public Const MOUSEEVENTF_RIGHTDOWN As Integer = 8
        Public Const MOUSEEVENTF_RIGHTUP As Integer = 16
        Public Const MOUSEEVENTF_ABSOLUTE  As Integer = &H8000
        Public Declare Sub mouse_event Lib "user32.dll" (ByVal dwFlags As Integer, ByVal dx As Integer, ByVal dy As Integer, ByVal cButtons As Integer, ByVal dwExtraInfo As UIntPtr)
     
        Public Sub Clic(ByVal p As Point)
            mouse_event(MOUSEEVENTF_LEFTDOWN Or MOUSEEVENTF_ABSOLUTE, p.X, p.Y, 0, UIntPtr.Zero)
            mouse_event(MOUSEEVENTF_LEFTUP Or MOUSEEVENTF_ABSOLUTE, p.X, p.Y, 0, UIntPtr.Zero)
        End Sub

  3. #3
    Membre extrêmement actif
    Inscrit en
    Avril 2008
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Âge : 65

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 573
    Par défaut
    bonjour

    Il y a une complication dans cette fonction de l'api...
    Il n'est pas possible de simuler en coords client les deplacements souris,car il faut disposer de l'acceleration souris en plus de sa Vitesse (SystemInformation.Speed donne sa Vitesse mais point d'acceleration ou Velocity )...
    Aussi l'exemple utilise les coords World du systeme:
    -top-left (0,0) et bottom-right(65535,6535)
    -meme les coords ecrans doivent etre converties dans le Systeme de coords
    World..
    -le flag MOUSEEVENTF_ABSOLUTE pour signaler que dx,dy du point destination sont calcules en coords World
    Moyennant ces dispositions l'exemple simule le mouvement et quelques clicks
    et montre comment :
    -convertir les coords du curseur en coords systems(on doit avoir un feedback user)
    -convertir les coords du point destination (exemple utilise le centre du picturebox mais ca peut etre ton point ..ou un point sur ma tete !!!)...
    code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
     
    Imports System.Runtime.InteropServices
     
    'pour faciliter le test ajouter dans cet ordre:
    '-textbox avec dock=top
    '-picturebox avec dock=fill
    '-button avec dock=bottom
    Public Class frmPicClick
     
     
        Const MOUSEEVENTF_MOVE As Int32 = &H1 '  mouse move
        Const MOUSEEVENTF_LEFTDOWN As Int32 = &H2 '  left button down
        Const MOUSEEVENTF_LEFTUP As Int32 = &H4 '  left button up
        Const MOUSEEVENTF_RIGHTDOWN As Int32 = &H8 '  right button down
        Const MOUSEEVENTF_RIGHTUP As Int32 = &H10 '  right button up
        Const MOUSEEVENTF_MIDDLEDOWN As Int32 = &H20 '  middle button down
        Const MOUSEEVENTF_MIDDLEUP As Int32 = &H40 '  middle button up
        Const MOUSEEVENTF_ABSOLUTE As Int32 = &H8000 '  absolute move
        Const MOUSEEVENTF_WHEEL As Int32 = &H800 ' wheel button rolled
     
        ' Simule movemement souris au centre du PictureBox & differents cliquages.
        Dim cur_x As Single
        Dim cur_y As Single
        Dim dest_x As Single
        Dim dest_y As Single
        Dim dx As Single = 500 ' increment du deplacement
        Dim dy As Single = 500
        Dim factW, FactH As Single 'mise à l'echelle aux coords systemes
        Public Sub New()
     
            ' Cet appel est requis par le concepteur.
            InitializeComponent()
     
            ' Ajoutez une initialisation quelconque après l'appel InitializeComponent().
            factW = 65535 / Screen.PrimaryScreen.Bounds.Height
            FactH = 65535 / Screen.PrimaryScreen.Bounds.Height
     
     
        End Sub
     
        Private Sub Button1_Click(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles Button1.Click
            txtResults.Clear()
     
     
            ' Mouse_Event se deplace en coords systeme ou
            ' (0, 0) =>top-left
            ' (65535,65535) bottom -right
     
            ' Calcul coords courant du mouse & conversion en coord systeme..
            cur_x = Cursor.Position.X * factW
            cur_y = Cursor.Position.Y * FactH
     
            ' Convertit coords du centre du PictureBox en coords systeme.
            Dim pt As Point = picClicker.PointToScreen(New Point(picClicker.ClientRectangle.Width / 2, picClicker.ClientRectangle.Height / 2))
            dest_x = pt.X * factW
            dest_y = pt.Y * FactH
     
            'Affiche ces coords
            txtResults.Text = txtResults.Text & "From " & Cursor.Position.X & " " & Cursor.Position.Y & " to " & pt.X & " " & pt.Y & vbCrLf
            txtResults.Text = txtResults.Text & "From " & cur_x & " " & cur_y & " to " & dest_x & " " & dest_y & vbCrLf
     
     
     
     
            ' Deplace la souris vers ces coords(centre du picturebox) et les "clicque" la souris.
            ' la mise des Flags veut dire on demande:
            ' MOUSEEVENTF_ABSOLUTE => coords absolues (cad system)
            ' MOUSEEVENTF_MOVE     => deplacer la souris
            ' MOUSEEVENTF_LEFTDOWN => generer un mousedown(le click est genere aussi ici)
            ' MOUSEEVENTF_LEFTUP   =>   generer un mouseup
            mouse_event(MOUSEEVENTF_ABSOLUTE + MOUSEEVENTF_MOVE + MOUSEEVENTF_LEFTDOWN + MOUSEEVENTF_LEFTUP, dest_x, dest_y, 0, 0)
     
        End Sub
     
        Private Sub picClicker_Click(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles picClicker.Click
            txtResults.Text = txtResults.Text & "MouseClick" & vbCrLf
     
        End Sub
     
        Private Sub picClicker_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles picClicker.MouseDown
            txtResults.Text = txtResults.Text & "MouseDown (" & e.X & ", " & e.Y & ")" & vbCrLf
        End Sub
     
        Private Sub picClicker_MouseUp(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles picClicker.MouseUp
            txtResults.Text = txtResults.Text & "MouseUp (" & e.X & ", " & e.Y & ")" & vbCrLf
        End Sub
     
     
        <DllImport("user32.dll", EntryPoint:="mouse_event", SetLastError:=True, _
       CharSet:=CharSet.Unicode, ExactSpelling:=True,
       CallingConvention:=CallingConvention.StdCall)>
        Public Shared Sub mouse_event(ByVal dwFlags As Integer,
                                      ByVal dx As Integer,
                                      ByVal dy As Integer,
                                      ByVal cButtons As Integer,
                                      ByVal dwExtraInfo As IntPtr)
        End Sub
      End Class
    bon code...

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 4
    Par défaut
    Merci beaucoup de vos réponses,
    mais je crois que ce n'est pas tout a fait ce que je cherche (ou alors je les ai mal compris / utilisée).

    Tomlev, avec les modifications que tu me donnes, les cliques continuent de se faire sur la position du curseur et non aux coordonnée (x,y) passée en paramètre .

    MABROUKI, la sa fonctionne, mais le curseur est déplacé (donc "capturé" et inutilisable pour l'utilisateur pendant ce temps la).

    Ce que je cherche c'est vraiment simuler des cliques indépendamment du curseur, pas sur sa position et sans le déplacer ni le rendre inutilisable en même temps. Pour l'instant je fais ça, on a l'illusion qu'on peut se servir du curseur (il bouge et peut cliquer) mais tout ce qui est selection est forcement désélectionné après ..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     Public Sub Clic(ByVal p As Point)
     
            Dim temp As Point = Cursor.Position
            Cursor.Position = New Point(p.X, p.Y)
     
            mouse_event(MOUSEEVENTF_LEFTDOWN , 0, 0, 0, UIntPtr.Zero)
            mouse_event(MOUSEEVENTF_LEFTUP , 0, 0, 0, UIntPtr.Zero)
     
            Cursor.Position = temp
     
        End Sub

Discussions similaires

  1. [SQL-Server] PHP5 et Windows server 64 bits
    Par Invité dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 19/02/2008, 14h54
  2. commande d'installation de windows xp 64 bit en mode MS-DOS
    Par readymasters dans le forum Windows XP
    Réponses: 1
    Dernier message: 16/10/2007, 20h53
  3. Linux 64 bits sur Windows XP 32 bits
    Par molgow dans le forum Windows XP
    Réponses: 5
    Dernier message: 06/02/2007, 14h20
  4. Windows XP 64 bit, Bien ou Pas Bien ?
    Par ePoX dans le forum Windows XP
    Réponses: 12
    Dernier message: 27/12/2005, 15h10
  5. windows XP 64 bits et application 16 bits
    Par JeanMarc_T2k dans le forum Windows XP
    Réponses: 2
    Dernier message: 21/11/2005, 11h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo