2010-09-15 29 views
11

Ich versuche, einen Mausklick auf ein Fenster zu simulieren. Im Moment habe ich Erfolg tut dies wie folgt (ich bin mit Python, aber es sollte auf allgemeines win32 gelten):win32: einen Klick simulieren, ohne Mausbewegungen zu simulieren?

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

Dies funktioniert gut. Wenn das Klicken jedoch geschieht, während ich die Maus manuell bewege, wird die Cursorposition abgeworfen. Gibt es eine Möglichkeit, einen Klick direkt an eine gegebene (x,y) Koordinate zu senden, ohne die Maus dort zu bewegen? Ich habe mit nicht viel Glück so etwas wie das folgende versucht:

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) 

Antwort

7

Versuchen Window() Funktion:

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

Die Koordinaten, die ich habe, sind absolute Koordinaten, aber keine Koordinaten relativ zur Fensterposition. Wird PostMessage sie als absolute oder als solche relativ zum Fenster übertragen? Ich könnte das hwnd schon bekommen, aber nur meine Coords in '(x - left, y - top)' übersetzen, wo ich 'left' und' top' von 'GetWindowRect' habe, hat nicht an der richtigen Stelle geklickt. – Claudiu

+0

Ah, wirklich. Sie müssen eine absolute Klickposition in die relative konvertieren. Verwenden Sie ScreenToClient (hWnd, lpPoint) vor PostMessage – Andrew

+0

ah ty, ich werde das versuchen! Gibt es in diesem Fall einen Unterschied zwischen Postnachricht und Sendemeldung? – Claudiu

3

Das ist nicht die Frage nicht beantworten, aber es ist mein Problem löst:

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

Das Ergebnis ist, dass alle Bewegungen, die ich mache, das Klicken nicht stören werden. Der Nachteil ist, dass meine tatsächliche Bewegung verpatzt wird, also bin ich noch offen für Vorschläge.