2010-05-12 10 views
6

Estoy tratando de enviar clics del mouse a un programa. Como no quiero que el mouse se mueva, no quiero usar SendInput o mouse_event, y dado que la ventana que debería recibir los clics realmente no usa botones u otros eventos GUI, no puedo enviar mensajes a estos botones.Haciendo clic en el mouse enviando mensajes

Estoy tratando de hacerlo funcionar usando SendMessage, pero por alguna razón no funciona. código en cuestión es (en C#, pero trató de Java con jnative también), tratando de esto en 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); 
    } 

El close funciona bien, pero el click no hace nada.

corregir: Ha encontrado el problema. Además del error estúpido de reemplazar las coordenadas xey, como se sugiere a continuación, no verifiqué si el identificador de Ventana que recibe el clic también es la ventana correcta del cliente. Ahora tengo

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

que funciona perfecto.

Respuesta

4

El problema es con su embalaje de las coordenadas x, y.

  1. y debería estar en la palabra de orden superior
  2. Debe utilizar | (Bit a bit o) para combinar los componentes del par de coordenadas

Usted debe tener las siguientes

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

@tobbez, el problema es que MAKELPARAM es una macro C, el código OPs es realmente C# y está usando Interop para llamar a las API de Win32. –

+1

aún mejor '(y << 16) | (x & 0xffff) ' – BlackBear

0

usted necesita para empacar las coordenadas correctamente como Chris dice, también recordar que x e y son las coordenadas del cliente , llama al ScreenToClient() para convertir coordenadas de pantalla.

Cuestiones relacionadas