【问题标题】:win32: simulate a click without simulating mouse movement?win32:模拟点击而不模拟鼠标移动?
【发布时间】:2011-04-12 20:49:05
【问题描述】:

我正在尝试模拟鼠标单击窗口。我目前已经成功执行以下操作(我使用的是 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)

【问题讨论】:

    标签: python winapi input automation mouse


    【解决方案1】:

    这没有回答问题,但确实解决了我的问题:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 我拥有的坐标是绝对坐标,但不是相对于窗口位置的坐标。PostMessage 会将它们作为绝对坐标还是相对于窗口的坐标传送?我实际上已经可以得到 hwnd,但只是将我的坐标转换为 (x - left, y - top),我从 GetWindowRect 得到 lefttop 并没有点击正确的位置。
      • 啊,真的。您需要将绝对点击位置转换为相对位置。在 PostMessage 之前使用 ScreenToClient(hWnd, lpPoint)
      • 啊,我试试看!在这种情况下,postmessage 和 sendmessage 之间有什么区别吗?
      • 我认为这种情况下postmessage和sendmessage没有区别。
      • 嘿,MAKELPARAM 来自哪里?
      猜你喜欢
      • 1970-01-01
      • 2016-04-14
      • 1970-01-01
      • 2014-11-21
      • 2022-11-18
      • 1970-01-01
      • 2012-08-20
      • 1970-01-01
      相关资源
      最近更新 更多