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.
@tobbez, il problema è che MAKELPARAM è una macro C, il codice OP è in realtà C# e sta utilizzando Interop per chiamare nelle API Win32. –
ancora meglio '(y << 16) | (x & 0xffff) ' – BlackBear