1

例如,当我想单击 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)
4

3 回答 3

1

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

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

于 2012-05-04T19:29:15.137 回答
1

mouse_event(和 SendInput,它是用于输入的首选 API)有一些棘手的问题, 在使用它之前,最好仔细阅读 MSDN 页面的 mouse_event - 注意小字:特别是, x 和 y 值不是像素,因此您不能只输入从 GetCursorPos 获得的值。

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

来自 MSDN:

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

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

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

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

于 2012-05-06T03:40:57.863 回答
0

下面的代码对我有用

pyautogui.mouseDown(fromx, fromy)
time.sleep(2)
pyautogui.mouseUp(tox, toy)
pyautogui.mouseUp(1000,400)
于 2020-05-25T16:02:03.443 回答