【问题标题】:Mouse click command does not work on certain GUIs鼠标单击命令在某些 GUI 上不起作用
【发布时间】:2012-04-26 20:32:30
【问题描述】:

下面的脚本在我想单击时完美运行,例如,Windows 上的“开始”按钮,但当我尝试单击某个 GUI 程序中的按钮时,它没有任何效果。

这个程序是否有可能禁用了虚拟鼠标点击? 如果是这样,我可以以某种方式规避这个问题吗?

import win32api, win32con
Po=win32api.GetCursorPos()
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,Po[0],Po[1],0,0)
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,Po[0],Po[1],0,0)

【问题讨论】:

    标签: python winapi mouse-cursor


    【解决方案1】:

    mouse_event(和 SendInput,这是用于输入的首选 API)有一些棘手的问题,最好 read the MSDN page for mouse_event 使用前请仔细检查 - 请注意小字:特别是 x 和 y 值是 not 像素,因此您不能只输入从 GetCursorPos 获得的值。

    恰好 0,0 是左下角,所以靠近左下角的点将大致位于屏幕的同一区域,但距离越远,像素值偏离的越多此 API 使用的实际单位:因此它似乎适用于开始按钮附近的位置(假设它位于屏幕的左下角),但对于其他值,它可能似乎正在点击其他地方,这听起来类似于你所看到的。

    来自 MSDN:

    dx [输入]
    类型:双字
    鼠标沿 x 轴的绝对位置或其自上次鼠标事件生成以来的运动量,取决于 MOUSEEVENTF_ABSOLUTE 的设置。绝对数据指定为鼠标的实际 x 坐标;相对数据被指定为移动的米奇数。米奇是鼠标必须移动的量才能报告它已经移动。

    首先,您需要 MOUTEVENTF_ABSOLUTE 标志。但这还不是全部:

    备注
    ... 如果指定了 MOUSEEVENTF_ABSOLUTE 值,则 dx 和 dy 包含 0 到 65,535 之间的标准化绝对坐标。 事件过程将这些坐标映射到显示表面上。坐标 (0,0) 映射到显示表面的左上角,(65535,65535) 映射到右下角。

    ...所以在将目标坐标传递给此 API 之前,您需要适当地缩放它们。

    【讨论】:

    • 正如引用所说:“坐标 (0,0) 映射到 -左角”。这与声明 “0,0 是左下角” 相矛盾。
    【解决方案2】:

    程序生成的鼠标事件具有“注入”属性,应用可以根据需要对其进行过滤 - 例如,MMO 客户端通常会过滤这些事件以避免机器人攻击

    mouse_event 中的那些零可以让你设置一些属性,你可能想研究一下它们是否能让你克服注入的标志,尽管我无法立即找到方法

    【讨论】:

      【解决方案3】:

      下面的代码对我有用

      pyautogui.mouseDown(fromx, fromy)
      time.sleep(2)
      pyautogui.mouseUp(tox, toy)
      pyautogui.mouseUp(1000,400)
      

      【讨论】:

        猜你喜欢
        • 2020-07-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多