win32: 使用SetCursorPos与mouse_event移动鼠标

7 投票
2 回答
10636 浏览
提问于 2025-04-16 04:11

在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 使用的加速曲线的影响。

撰写回答