2010-09-15 13 views
11

Sto provando a simulare un clic del mouse su una finestra. Al momento ho il successo facendo questo come segue (sto usando Python, ma dovrebbe applicarsi a win32 generale):win32: simula un clic senza simulare il movimento del mouse?

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

Questo funziona bene. Tuttavia, se il clic si verifica mentre sto muovendo il mouse manualmente, la posizione del cursore viene eliminata. C'è un modo per inviare un clic direttamente a una determinata coordinata (x,y) senza spostare il mouse lì? Ho provato qualcosa di simile a quanto segue con non molta fortuna:

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) 

risposta

7

Prova) Funzione WindowFromPoint (:

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

Le coordinate che ho sono coordinate assolute, però, non coordinate relative alla posizione della finestra .. PostMessage le trasmetterà come assolute o come relative alla finestra? In realtà, potevo già avere l'hwnd, ma solo tradurre le mie coordinate in '(x - left, y - top)', dove ho ottenuto 'left' e' top' da 'GetWindowRect' non ho cliccato nel punto giusto. – Claudiu

+0

Ah, davvero. È necessario convertire una posizione di clic assoluta nel relativo. Usa ScreenToClient (hWnd, lpPoint) prima di PostMessage – Andrew

+0

ah, ci proverò! c'è qualche diff tra postmessage e sendmessage in questo caso? – Claudiu

3

Questo non risponde alla domanda, ma non risolvere il mio 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)) 

Il risultato è che qualsiasi movimento che sto facendo non interferirà con il clic. Il rovescio della medaglia è che il mio movimento attuale sarà incasinato, quindi sono ancora aperto a suggerimenti.

Problemi correlati