Win32:使用SetCursorPos和mouse_event移动鼠标的区别

7
有没有区别在Windows中使用以下两种技术移动鼠标?
win32api.SetCursorPos((x,y))

vs:

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个回答

6
我认为mouse_event的作用是将事件插入鼠标输入流中,而SetCursorPos只是在屏幕上移动光标。我不认为SetCursorPos会生成任何输入事件(虽然我可能错了)。
实际影响是,当你使用SetCursorPos时,它只是移动光标。而当你使用mouse_event时,它会将事件插入输入流中,从而为任何正在监听的程序生成输入事件。这对于监听较低级别鼠标事件而不仅仅是光标点击的程序有影响,例如游戏。此外,如果您使用mouse_event来移动光标并启用光标/指针加速,则产生的鼠标运动应受到Windows使用的任何加速曲线的影响。

另一个不同之处是SetCursorPos可以将鼠标位置设置到第二个显示器,而SendInput/mouse_event的绝对定位仅限于主显示器。 - Jared Updike
@JaredUpdike 这并不完全正确。通过组合位标志“ABSOLUTE”、“MOVE”和“VIRTUALDESK”,您可以将鼠标移动到辅助显示器上。 - Lord-JulianXLII

0
jay.lee的答案是正确的。我只想给出一个简单的例子,说明他指出的差异在具体用例中可能如何呈现。
您可以通过按住左键并拖动光标来选择/标记文本(换句话说,将光标移动到新位置)。
如果我们使用SetCursorPos模拟光标/鼠标的移动,则不会选择任何文本。
但是,如果我们使用SendInput(或mouse_event)的move输入,则我们起始位置和结束位置之间的文本将被选择/突出显示。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接