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.
@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. –
aún mejor '(y << 16) | (x & 0xffff) ' – BlackBear