鼠标单击命令在某些GUI上不起作用
问题描述:
当我想单击Windows上的“开始”按钮时,下面的脚本完美工作,但当我尝试单击某个GUI程序中的按钮时,它没有任何影响。鼠标单击命令在某些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)
答
mouse_event(和SendInput,这是用于输入的首选API)有一些棘手位,这是一个好主意, read the MSDN page for mouse_event充分和仔细usi之前请注意小字体:特别是,x和y的值不是而是像素,因此您不能只输入您从GetCursorPos获得的值。
刚刚发生的事情是,0,0是左下角,所以靠近左下角的点大致位于屏幕的同一区域,但距离越远,像素值越分散从该API使用的实际单位开始:所以它可能看起来适用于开始按钮附近的位置(假设它位于屏幕的左下角),但对于其他值,它可能似乎在其他位置点击,这听起来很相似到你所看到的。
从MSDN:
DX [IN]
类型:
生成鼠标的沿着x轴或它的自上次鼠标事件运动量绝对位置DWORD,这取决于设置MOUSEEVENTF_ABSOLUTE。绝对数据被指定为鼠标的实际x坐标;相对数据被指定为移动的mickeys数量。 mickey是鼠标为了报告它已经移动而必须移动的量。
因此,首先,您需要MOUTEVENTF_ABSOLUTE标志。但是,这还不是全部:
备注
... 如果指定MOUSEEVENTF_ABSOLUTE值, dx和dy包含在0到65,535之间的标准绝对坐标。事件过程将这些坐标映射到显示表面上。坐标(0,0)映射到显示表面的左上角,(65535,65535)映射到右下角。
...因此,您需要在将它们传递给此API之前适当缩放目标坐标。
答
由程序生成的
鼠标事件有一个“注入”的属性,如果他们需要的应用程序可以过滤 - 例如MMO客户经常过滤那些以避免机器人
在这些零mouse_event让你设置一些属性,你可能想研究,如果这些会让你克服注入的标志,但我不能立即找到方式