鼠标单击命令在某些GUI上不起作用

时间:2012-04-26 20:32:30

标签: python winapi cursor mouse

当我想点击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)

3 个答案:

答案 0 :(得分:1)

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

mouse_event中的那些零允许你设置一些属性,你可能想研究一下这些是否会让你克服注入的标志,虽然我找不到立刻的方法

答案 1 :(得分:1)

mouse_event(和SendInput,这是用于输入的首选API)有几个棘手的位,这是一个好主意 read the MSDN page for mouse_event在使用它之前要小心谨慎 - 注意小字体:特别是x和y值不是像素,所以你不能只输入你得到的值GetCursorPos。

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

来自MSDN:

dx [in]
键入:DWORD
根据MOUSEEVENTF_ABSOLUTE的设置,生成自上次鼠标事件以来x轴或其运动量的鼠标绝对位置。绝对数据被指定为鼠标的实际x坐标;相对数据被指定为移动的mickeys数。米奇是鼠标必须移动以报告它已移动的量。

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

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

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

答案 2 :(得分:0)

下面的代码对我有用

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