Simulazione di un tasto del mouse in Windows
Domanda
Sto scrivendo clone di desktop remoto in C ++ utilizzando QT. Finora sono in grado di spostare il cursore del mouse intorno bene. QT ha una bella funzione di SETPOS per questo. Tuttavia, io sono un po 'perso di ciò che API / libreria da utilizzare per la simulazione di clic del pulsante del mouse.
Un metodo che sono a conoscenza di è quello di inviare il WM_ (evento) per una finestra utilizzando HWND della finestra. Tuttavia, speravo ci fosse un metodo più saliente per prendere il controllo completo su di un mouse. C'è un altro modo per dire al sistema operativo che il pulsante sinistro del mouse è stato cliccato?
Grazie.
Soluzione
Questo è in C #, ma potrebbe aiutare a ottenere un'idea:
[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);
}
Risorse che potrebbero aiutare:
http://msdn.microsoft.com /en-us/library/ms646260%28VS.85%29.aspx
http://www.codeguru.com/Cpp/ WP / win32 / Article.php / c4543 /
Altri suggerimenti
La combinazione di tutti togegher, ecco il codice per Qt:
#include <windows.h>
QApplication::desktop()->cursor().setPos(globalX,globalY);
mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 1, 1, 0, 0);
Lukas Šalkauskas' ha lavorato per me per un bel po 'di tempo, ma oggi improvvisamente provocato il seguente errore (forse a causa di qualche aggiornamento di .NET da Windows Update?)
Una chiamata alla funzione di PInvoke 'SampleMethod' ha squilibrato il pila. Ciò è probabilmente perché la firma PInvoke gestito non lo fa corrispondere alla firma di destinazione non gestito. Verificare che la convenzione di chiamata e parametri della firma PInvoke abbinare il bersaglio firma non gestito.
Così ho acceso per la pinvoke.net codice di esempio e funziona bene ora:
[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);
}