win32: 如何在不移动鼠标的情况下模拟点击?
我正在尝试在一个窗口上模拟鼠标点击。目前我成功地用以下方式实现了这一点(我使用的是Python,但这应该适用于一般的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)
2 个回答
5
这段话虽然没有直接回答问题,但解决了我的困扰:
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))
结果是我现在的任何移动都不会影响到点击操作。不过,这样一来我的实际移动就会变得很混乱,所以我还是希望能听听其他的建议。
11
试试 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);