2010-11-17 30 views
4

Je cherche à envoyer un clic de souris à une position spécifique sur un écran sans affecter l'emplacement du curseur de la souris.Envoyer un clic de souris à une position spécifique sans déplacer la souris

J'ai écumé et ai essayé tout sous le soleil avec mouse_event (qui est censé le faire)

mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, X, Y, 0, 0); 

Cependant cela finit par envoyer un seul clic de souris à l'endroit où la position de la souris est. Je finis par devoir bouger la souris pour que ça marche.

Cursor.Position = new Point(X, Y); 

Quelqu'un at-il une idée de comment je peux le faire SANS avoir à déplacer la souris? J'ai aussi essayé le bloc de code suivant sans succès car il reste seulement cliqué où la position du curseur de la souris est ce qui m'a vraiment jeté pour une boucle que je me suis dit cela aurait travaillé ...

 Cursor.Position = new Point(X, Y); 
     mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, X, Y, 0, 0); 
     Cursor.Position = new Point(oldX, oldY); 

Merci à l'avance pour toute aide!

Répondre

0

Vous envoyez probablement le clic de souris au mauvais endroit. mouse_event prend les valeurs X et Y dans les microphones, comme décrit dans la documentation here.

Essayez de convertir votre position avec quelque chose comme ceci:

private static Point ScreenLocationToMickeyLocation(Point mouseLocation) 
{ 
    Rectangle virtualScreen = SystemInformation.VirtualScreen; 

    return new Point(
     ((mouseLocation.X - virtualScreen.X) * 65535)/virtualScreen.Width, 
     ((mouseLocation.Y - virtualScreen.Y) * 65535)/virtualScreen.Height); 
} 
+0

Est-ce que cela me aider à cliquer sans déplacer la souris ??? – Jet

1

Vous ne comprenait pas le drapeau de MOUSEEVENTF_MOVE, de sorte que le curseur ne va pas se déplacer.

Je recommanderais de faire 3 appels distincts (déplacer, descendre, haut), faire tout en même temps est incertain. Mais peut-être travailler, expérimenter si vous voulez vraiment réduire cela. Btw, SendInput est ce que le SDK vous recommande d'utiliser.

0

Vous pouvez essayer de capturer l'emplacement actuel de la souris, déplacer la souris à l'endroit où vous voulez qu'elle clique, cliquer sur l'emplacement, puis reculer la souris. Si cela est fait assez rapidement, il semble que la souris n'a pas bougé.

+0

Avez-vous un exemple de code à portée de main pour montrer comment déplacer la souris rapidement - peut-être même avec un pointeur de souris invisible temporaire? – surfmuggle

+0

Cela ne fonctionnera pas parce que le «clic» en utilisant les API de gain a un certain délai, ne comptez pas sur cette méthode. déjà. – Stavm

0

déclaration visuelle communautaire 2015 de base

Importations System.Runtime.InteropServices

<Flags()> 
Public Enum MouseEventFlags As UInteger 
    MOUSEEVENTF_ABSOLUTE = &H8000 
    MOUSEEVENTF_LEFTDOWN = &H2 
    MOUSEEVENTF_LEFTUP = &H4 
    MOUSEEVENTF_MIDDLEDOWN = &H20 
    MOUSEEVENTF_MIDDLEUP = &H40 
    MOUSEEVENTF_MOVE = &H1 
    MOUSEEVENTF_RIGHTDOWN = &H8 
    MOUSEEVENTF_RIGHTUP = &H10 
    MOUSEEVENTF_XDOWN = &H80 
    MOUSEEVENTF_XUP = &H100 
    MOUSEEVENTF_WHEEL = &H800 
    MOUSEEVENTF_HWHEEL = &H1000 
End Enum 

Dim pntapi As POINTAPI 
Declare Function GetCursorPos Lib "user32" Alias "GetCursorPos" (ByRef lpPoint As POINTAPI) As Integer 
Declare Function SetCursorPos Lib "user32" Alias "SetCursorPos" (ByVal X As Integer, ByVal Y As Integer) As Integer 
Public Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Integer, ByVal dx As Integer, ByVal dy As Integer, ByVal dwData As Integer, ByVal dwExtraInfo As Integer)