win32: 如何在不移动鼠标的情况下模拟点击?

10 投票
2 回答
21830 浏览
提问于 2025-04-16 04:11

我正在尝试在一个窗口上模拟鼠标点击。目前我成功地用以下方式实现了这一点(我使用的是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);

撰写回答