2010-09-15 231 views
11

我想模擬鼠標點擊一個窗口。目前,我有成功這樣做如下(我使用Python,但它應該適用於一般的win32):win32:模擬點擊而不模擬鼠標移動?

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

這工作得很好。但是,如果在我手動移動鼠標時發生點擊,光標位置將被丟棄。有沒有辦法直接發送點擊給定的(x,y)座標,而不用將鼠標移動到那裏?我已經試過類似沒有太大的運氣如下:

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) 

回答

7

嘗試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

我擁有的座標是絕對座標,但不是相對於窗口位置的座標。PostMessage會將它們作爲絕對座標或相對於窗口的座標發送出去?我實際上已經可以獲得hwnd了,但只是將我的座標轉換爲'(x - left,y - top)',我從'GetWindowRect'得到'left'和'top'沒有在正確的位置點擊。 – Claudiu 2010-09-15 19:39:11

+0

啊,真的。您需要將絕對點擊位置轉換爲相對位置。在PostMessage之前使用ScreenToClient(hWnd,lpPoint) – Andrew 2010-09-15 20:26:40

+0

啊,我會試試!在這種情況下postmessage和sendmessage之間是否有差異? – Claudiu 2010-09-15 22:41:18

3

這不回答這個問題,但它確實解決了我的問題:

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

結果是,我所做的任何移動都不會干擾點擊。缺點是我的實際運動會搞砸,所以我仍然樂於接受建議。