2010-05-12 11 views
6

Ich versuche, Mausklicks an ein Programm zu senden. Da ich nicht möchte, dass sich die Maus bewegt, möchte ich nicht SendInput oder mouse_event verwenden, und da das Fenster, das die Klicks erhalten soll, nicht wirklich Buttons oder andere GUI-Ereignisse verwendet, kann ich keine Nachrichten an diese senden Tasten.Mausklick durch Senden von Nachrichten

Ich versuche, dies mit SendMessage arbeiten, aber aus irgendeinem Grund funktioniert es nicht. Relevante Code (in C#, aber versucht, Java mit jnative auch), das versucht, auf Vista

[DllImport("user32.dll", CharSet=CharSet.Auto)] 
    public static extern int SendMessage(IntPtr A_0, int A_1, int A_2, int A_3); 

    static int WM_CLOSE = 0x10; 
    static int WM_LBUTTONDOWN = 0x201; 
    static int WM_LBUTTONUP = 0x202; 

    public static void click(IntPtr hWnd, int x, int y) 
    { 
     SendMessage(hWnd, WM_LBUTTONDOWN, 1, ((x << 0x10)^y)); 
     SendMessage(hWnd, WM_LBUTTONUP, 0, ((x << 0x10)^y)); 
    } 

    public static void close(IntPtr hWnd) 
    { 
     SendMessage(hWnd, WM_CLOSE, 0, 0); 
    } 

Die close funktioniert gut, aber die click tut nichts.

bearbeiten: Das Problem gefunden. Neben dem dummen Bug zum Ersetzen der X- und Y-Koordinaten, wie unten vorgeschlagen, habe ich nicht überprüft, ob das Fenster-Handle, das den Klick erhält, auch das korrekte Client-Fenster ist. Ich habe jetzt

 POINT p = new POINT(x, y); 
     IntPtr hWnd = WindowFromPoint(p); 

     RECT rct = new RECT(); 

     if (!GetWindowRect(hWnd, ref rct)) 
     { 
      return; 
     } 

     int newx = x - rct.Left; 
     int newy = y - rct.Top; 
     SendMessage(hWnd, WM_LBUTTONDOWN, 1, newy * 65536 + newx); 
     SendMessage(hWnd, WM_LBUTTONUP, 0, newy * 65536 + newx); 

, die perfekt funktioniert.

Antwort

4

Das Problem ist mit Ihrer Verpackung der x, y-Koordinaten.

  1. y im Wort hoher Ordnung sein sollte
  2. Sie sollten verwenden | (Bitweise oder) zu kombinieren, um die Komponenten des Koordinatenpaar

Sie sollten die haben folgende

((y << 0x10) | x) 
+0

@tobbez, das Problem ist, dass MAKELPARAM ist ein C-Makro, der OPs-Code ist eigentlich C# und er verwendet Interop in die Win32-APIs aufrufen. –

+1

noch besser '(y << 16) | (x & 0xffff) ' – BlackBear

0

Sie müssen richtig um die Koordinaten zu packen wie Chris sagt, auch daran erinnern, dass x und y-Client Koordinaten , rufen Sie ScreenToClient() an, um Bildschirmkoordinaten zu konvertieren.

Verwandte Themen