2010-05-12 17 views
6

Sto provando a inviare clic del mouse a un programma. Siccome non voglio che il mouse si muova, non voglio usare SendInput o mouse_event, e poiché la finestra che dovrebbe ricevere i clic non usa realmente i pulsanti o altri eventi della GUI, non posso inviare messaggi a questi pulsanti.Fare clic con il mouse inviando messaggi

Sto cercando di farlo funzionare con SendMessage, ma per qualche motivo non funziona. relativo codice è (in C#, ma ha cercato Java con jnative pure), provare questo su 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); 
    } 

Il close funziona bene, ma il click non fa nulla.

modifica: trovato il problema. Oltre allo stupido bug per sostituire le coordinate xey, come suggerito di seguito, non ho verificato se l'handle di Window che riceve il click sia anche la finestra del client corretta. Ora ho

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

che funziona perfettamente.

risposta

4

Il problema è con l'imballaggio delle coordinate x, y.

  1. y dovrebbe essere nella parola di ordine superiore
  2. Si dovrebbe usare | (OR bit a bit) per combinare i componenti della coppia di coordinate

si dovrebbe avere la seguente

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

@tobbez, il problema è che MAKELPARAM è una macro C, il codice OP è in realtà C# e sta utilizzando Interop per chiamare nelle API Win32. –

+1

ancora meglio '(y << 16) | (x & 0xffff) ' – BlackBear

0

È necessario mettere in valigia le coordinate correttamente come Chris dice, anche ricordare che x ed y sono coordinate client , chiamare ScreenToClient() per convertire le coordinate dello schermo.

Problemi correlati