2009-11-16 6 views
2

J'écris un clone Remote Desktop en C++ en utilisant QT. Jusqu'à présent, je suis en mesure de déplacer le curseur de la souris autour bien. QT a une belle fonction setPos pour ça. Cependant, je suis un peu perdu quant à l'API/bibliothèque à utiliser pour simuler les clics sur les boutons de la souris.Simulation d'un clic de souris dans Windows

Une méthode que je connais est d'envoyer le WM_ (événement) à une fenêtre en utilisant HWND de la fenêtre. Cependant, j'espérais qu'il y avait une méthode plus saillante pour prendre le contrôle complet sur une souris. Existe-t-il un autre moyen de dire au système d'exploitation que le bouton gauche de la souris a été cliqué?

Merci.

+0

Salut Nick. Comment avez-vous réussi avec votre bureau à distance? Je suis en train d'étendre une application avec un support à distance. Je me demande, comment avez-vous résolu la saisie de texte dans les composants de texte (le cas échéant)? Il est facile de reconnaître dans Qt, si un widget sous le curseur est un QLineEdit ou similaire. Mais que faire pour les objets Windows natifs? –

Répondre

2

C'est en C#, mais peut vous aider à obtenir une idée:

[DllImport("user32.dll",CharSet=CharSet.Auto, CallingConvention=CallingConvention.StdCall)] 
    public static extern void mouse_event(long dwFlags, long dx, long dy, long cButtons, long dwExtraInfo); 

    private const int MOUSEEVENTF_LEFTDOWN = 0x02; 
    private const int MOUSEEVENTF_LEFTUP = 0x04; 
    private const int MOUSEEVENTF_RIGHTDOWN = 0x08; 
    private const int MOUSEEVENTF_RIGHTUP = 0x10; 

    public void DoMouseClick() 
    { 
     int X = Cursor.Position.X; 
     int Y = Cursor.Position.Y; 
     mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, X, Y, 0, 0); 
    } 

ressources qui pourraient aider:

http://msdn.microsoft.com/en-us/library/ms646260%28VS.85%29.aspx

http://www.codeguru.com/Cpp/W-P/win32/article.php/c4543/

+1

C'est tout à fait faux, les arguments ne sont pas * long *. –

3

solution Lukas Šalkauskas a travaillé pour moi pendant un certain temps, mais aujourd'hui, il a soudainement abouti à la f erreur uite (peut-être en raison d'une mise à jour de .NET par Windows Update?)

Un appel à la fonction PInvoke 'SampleMethod' a déséquilibré la pile . Cela est probablement dû au fait que la signature PInvoke gérée ne correspond pas à la signature cible non gérée . Vérifiez que la convention d'appel et les paramètres de la signature PInvoke correspondent à la signature non managée cible.

donc je suis passé à la pinvoke.net sample code et il fonctionne bien maintenant:

[DllImport("user32.dll")] 
static extern void mouse_event(int dwFlags, int dx, int dy, int dwData, int dwExtraInfo); 

[Flags] 
public enum MouseEventFlags 
{ 
    LEFTDOWN = 0x00000002, 
    LEFTUP = 0x00000004, 
    MIDDLEDOWN = 0x00000020, 
    MIDDLEUP = 0x00000040, 
    MOVE = 0x00000001, 
    ABSOLUTE = 0x00008000, 
    RIGHTDOWN = 0x00000008, 
    RIGHTUP = 0x00000010 
} 

public static void LeftClick(int x, int y) 
{ 
    Cursor.Position = new System.Drawing.Point(x, y); 
    mouse_event((int)(MouseEventFlags.LEFTDOWN), 0, 0, 0, 0); 
    mouse_event((int)(MouseEventFlags.LEFTUP), 0, 0, 0, 0); 
} 
8

La combinaison de toutes togegher, voici le code pour Qt:

#include <windows.h> 
QApplication::desktop()->cursor().setPos(globalX,globalY); 
mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 1, 1, 0, 0); 
+0

ça marche vraiment! –

Questions connexes