2010-09-15 12 views
11

J'essaye de simuler un clic de souris sur une fenêtre. J'ai actuellement le succès à faire, comme suit (j'utilise Python, mais il devrait appliquer à win32 général):win32: simuler un clic sans simuler le mouvement de la souris?

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

Cela fonctionne très bien. Toutefois, si le clic se produit lorsque je déplace manuellement la souris, la position du curseur est désactivée. Est-il possible d'envoyer un clic directement à une coordonnée donnée (x,y) sans y déplacer la souris? J'ai essayé quelque chose comme ce qui suit avec pas beaucoup de chance:

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) 

Répondre

7

fonction Try 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

Les coordonnées que j'ai sont des coordonnées absolues, cependant, pas de coordonnées par rapport à la position de la fenêtre. PostMessage les transmettra-t-il comme absolues ou comme celles relatives à la fenêtre? En fait, je pouvais déjà obtenir le hwnd, mais traduire juste mes coords à '(x - left, y - top)', où 'got' left' et 'top' de' GetWindowRect' ne cliquait pas au bon endroit. – Claudiu

+0

Ah, vraiment. Vous devez convertir une position de clic absolue dans le relatif. Utilisez ScreenToClient (hWnd, lpPoint) avant PostMessage – Andrew

+0

ah ty, je vais essayer ça! Y a-t-il des différences entre postmessage et sendmessage dans ce cas? – Claudiu

3

Cela ne répond pas à la question, mais il ne résout mon problème:

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

Le résultat est que tous les mouvements que je fais n'interféreront pas avec le clic. L'inconvénient est que mon mouvement réel sera foiré, donc je suis toujours ouvert aux suggestions.