2010-09-15 6 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.

Questions connexes