win32:模拟点击而不模拟鼠标移动?

Cla*_*diu 11 python mouse winapi automation input

我正试图在窗口上模拟鼠标点击.我目前的成功如下(我使用的是Python,但它应该适用于一般的win32):

win32api.SetCursorPos((x,y))
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,0,0)
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,0,0)
Run Code Online (Sandbox Code Playgroud)

这很好用.但是,如果在我手动移动鼠标时发生单击,则光标位置会被抛弃.有没有办法直接将点击发送到给定(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)
Run Code Online (Sandbox Code Playgroud)

And*_*rew 9

试试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);
Run Code Online (Sandbox Code Playgroud)

  • 嘿,“MAKELPARAM”从哪里来? (4认同)

Cla*_*diu 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))
Run Code Online (Sandbox Code Playgroud)

结果是我所做的任何动作都不会干扰点击。缺点是我的实际动作会被搞乱,所以我仍然愿意接受建议。