如何正确覆盖其他应用程序中的鼠标事件 (Windows)?
How to properly override mouse events in other apps (Windows)?
我正在尝试使用鼠标中键实现系统范围内的拖动操作。它应该覆盖其他程序中的鼠标中键拖动行为。目前,我正在使用系统范围的挂钩处理全局鼠标事件。
问题是 - 许多程序仍然接收和处理相同的事件,就像我没有拦截它们一样。
这是我尝试过的:
不为鼠标按下事件调用下一个钩子:我从来没有收到鼠标松开,所以我不知道何时何地停止拖动
不为鼠标移动调用下一个钩子:光标速度大大降低
不调用鼠标松开的下一个挂钩:系统中的大多数 windows 在我完成拖动后完全停止对鼠标事件做出反应
始终调用链中的下一个挂钩:如果鼠标下的控件在其中滚动,则大多数时候它会在我进行拖动时滚动。此外,UWP 应用程序在我拖动期间继续接收鼠标事件,因此如果 MS Edge 中的 link 在启动时恰好位于光标下方,并且鼠标没有离开 Edge 边界,Edge 将接收点击事件,并打开新选项卡
我需要的是:当用户按住鼠标中键并开始拖动时,应该调用我的拖动处理程序,并且不会发生其他处理程序,如文件拖动、滚动等。
我最终得到了一个有点老套的解决方案:
- 不为中间按钮调用鼠标按下的下一个钩子
- 记录按下的位置
- 在处理鼠标弹起时,如果用户没有拖动 - 使用 SendInput 从单独的线程重播整个鼠标弹起 + 鼠标按下(以避免由于重入造成的死锁)
我正在尝试使用鼠标中键实现系统范围内的拖动操作。它应该覆盖其他程序中的鼠标中键拖动行为。目前,我正在使用系统范围的挂钩处理全局鼠标事件。
问题是 - 许多程序仍然接收和处理相同的事件,就像我没有拦截它们一样。
这是我尝试过的:
不为鼠标按下事件调用下一个钩子:我从来没有收到鼠标松开,所以我不知道何时何地停止拖动
不为鼠标移动调用下一个钩子:光标速度大大降低
不调用鼠标松开的下一个挂钩:系统中的大多数 windows 在我完成拖动后完全停止对鼠标事件做出反应
始终调用链中的下一个挂钩:如果鼠标下的控件在其中滚动,则大多数时候它会在我进行拖动时滚动。此外,UWP 应用程序在我拖动期间继续接收鼠标事件,因此如果 MS Edge 中的 link 在启动时恰好位于光标下方,并且鼠标没有离开 Edge 边界,Edge 将接收点击事件,并打开新选项卡
我需要的是:当用户按住鼠标中键并开始拖动时,应该调用我的拖动处理程序,并且不会发生其他处理程序,如文件拖动、滚动等。
我最终得到了一个有点老套的解决方案:
- 不为中间按钮调用鼠标按下的下一个钩子
- 记录按下的位置
- 在处理鼠标弹起时,如果用户没有拖动 - 使用 SendInput 从单独的线程重播整个鼠标弹起 + 鼠标按下(以避免由于重入造成的死锁)