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.

È stato utile?

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);
soluzione

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);
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top