win32: 使用SetCursorPos与mouse_event移动鼠标
在Windows系统中,用下面这两种方法移动鼠标,有什么区别吗?
win32api.SetCursorPos((x,y))
和:
nx = x*65535/win32api.GetSystemMetrics(0)
ny = y*65535/win32api.GetSystemMetrics(1)
win32api.mouse_event(win32con.MOUSEEVENTF_ABSOLUTE|win32con.MOUSEEVENTF_MOVE,nx,ny)
Windows处理这些移动的方式有什么不同吗?
2 个回答
0
jay.lee的回答是对的。我想给大家举个简单的例子,说明他提到的区别在实际使用中是怎么体现的。
你可以通过按住左键并拖动鼠标来选择或标记文本。(换句话说,就是把鼠标移动到一个新的位置。)
如果我们用SetCursorPos
来模拟鼠标的移动,那么文本是不会被选中的。
但是,如果我们使用SendInput
(或者mouse_event
)的move
输入,起始位置和结束位置之间的文本就会被选中或高亮显示。
6
我认为 mouse_event
是通过把鼠标事件放进鼠标输入流来工作的,而 SetCursorPos
只是简单地移动光标在屏幕上的位置。我觉得 SetCursorPos
也不会产生任何输入事件(不过我可能错了)。
这意味着,当你使用 SetCursorPos
时,它只是移动光标而已。而当你使用 mouse_event
时,它会把事件放进输入流,这样就会生成输入事件,任何在监听这些事件的程序都会收到。这对于一些需要监听更底层鼠标事件的程序,比如游戏,就很重要了。此外,如果你用 mouse_event
来移动光标,并且开启了光标加速,那么最终的鼠标移动会受到 Windows 使用的加速曲线的影响。