2010-09-15 28 views
11

Estoy tratando de simular un clic del mouse en una ventana. Actualmente tengo éxito haciendo esto de la siguiente manera (estoy usando Python, pero debe aplicarse a Win32 general):win32: simular un clic sin simular el movimiento del mouse?

win32api.SetCursorPos((x,y)) 
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,0,0) 
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,0,0) 

Esto funciona bien. Sin embargo, si el clic ocurre mientras muevo el mouse manualmente, la posición del cursor se descarta. ¿Hay alguna manera de enviar un clic directamente a una determinada coordenada (x,y) sin mover el mouse allí? He intentado algo como lo siguiente con no mucha suerte:

nx = x*65535/win32api.GetSystemMetrics(0) 
ny = y*65535/win32api.GetSystemMetrics(1) 
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN | \ 
        win32con.MOUSEEVENTF_ABSOLUTE,nx,ny) 
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP | \ 
        win32con.MOUSEEVENTF_ABSOLUTE,nx,ny) 

Respuesta

7

Trate WindowFromPoint función():

POINT pt; 
    pt.x = 30; // This is your click coordinates 
    pt.y = 30; 

HWND hWnd = WindowFromPoint(pt); 
LPARAM lParam = MAKELPARAM(pt.x, pt.y); 
PostMessage(hWnd, WM_RBUTTONDOWN, MK_RBUTTON, lParam); 
PostMessage(hWnd, WM_RBUTTONUP, MK_RBUTTON, lParam); 
+1

Las coordenadas que tengo son coordenadas absolutas, sin embargo, no son coordenadas relativas a la posición de la ventana ... ¿PostMessage las transmitirá como absolutas o como relativas a la ventana? De hecho, ya podía obtener el hwnd, pero la traducción de mis coords a '(x - left, y - top)', donde obtuve 'left' y' top' de 'GetWindowRect' no hizo clic en el lugar correcto. – Claudiu

+0

Ah, de verdad. Necesita convertir una posición de clic absoluta en la relativa. Use ScreenToClient (hWnd, lpPoint) antes de PostMessage – Andrew

+0

¡ah, intentaré eso! ¿Hay alguna diferencia entre postmessage y sendmessage en este caso? – Claudiu

3

Esto no responde a la pregunta, pero no resuelve mi problema:

win32api.ClipCursor((x-1,y-1,x+1,y+1)) 
win32api.SetCursorPos((x,y)) 
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN| \ 
        win32con.MOUSEEVENTF_ABSOLUTE,0,0) 
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP| \ 
        win32con.MOUSEEVENTF_ABSOLUTE,0,0) 
win32api.ClipCursor((0,0,0,0)) 

El resultado es que cualquier movimiento que realice no interferirá con el clic. La desventaja es que mi movimiento real estará en mal estado, por lo que todavía estoy abierto a sugerencias.

Cuestiones relacionadas