C# 挂钩以获取原始鼠标/键事件
Posted
技术标签:
【中文标题】C# 挂钩以获取原始鼠标/键事件【英文标题】:C# Hooking to get Raw Mouse/Key events 【发布时间】:2018-12-19 05:48:53 【问题描述】:让我看看我是否可以描述我正在尝试做的事情。目前,您的鼠标仅限于在屏幕尺寸范围内移动。我想删除此限制并允许鼠标继续超出边界(理论上是无限的)并让它控制我正在构建的程序中的各个方面,但是当鼠标移回屏幕尺寸时将鼠标返回屏幕.所以我的想法是,一旦鼠标到达并突破屏幕边缘,我的程序将开始禁止发送鼠标消息(以及键盘/剪贴板消息),但随后继续监视原始鼠标(和键盘/剪贴板) delta 从该点开始变化,直到它回到屏幕范围内。
我已经有一个使用 SetWindowsHookEx() 并返回低级鼠标事件(例如 WM_MOUSEMOVE)的工作示例,但是,返回的结构 (MSLLHOOKSTRUCT) 似乎不够低级寻找此示例返回屏幕 X 和 Y 坐标,但我需要更接近 delta 而不是“渲染”坐标。从文档来看,我似乎需要 RAWMOUSE 数据。有很多关于 RAWMOUSE 数据类型的文档,但没有太多关于如何挂钩来获取该类型消息的文档。
如前所述,我还希望监视键盘和剪贴板类型的事件(当鼠标离开屏幕时抑制,控制我的程序),所以如果有更好的方法可以让这些事件正确挂钩进入监视/抑制,但听起来我不一定需要键盘和剪贴板事件成为原始数据,因为键盘和剪贴板没有像鼠标那样可以突破的界限。但我认为键盘/剪贴板抑制超出了我当前问题的范围,但如果解决方案恰好也解决了该问题,则很有帮助。
【问题讨论】:
【参考方案1】:有很多关于 RAWMOUSE 数据类型的文档,但没有太多关于如何挂钩来获取该类型消息的文档。
你需要使用RegisterRawInputDevices()
注册鼠标,然后你需要处理WM_INPUT
窗口消息来获取移动数据。有关详细信息,请参阅 MSDN 上的Raw Input。
但是请注意,您可以使用 RawInput API 仅观察鼠标活动,但不能使用该 API 阻止它。为此,您需要继续使用SetWindowsHookEx()
。所以你的钩子需要相互协调。请参阅 CodeProject 上的 Combining Raw Input and keyboard Hook to selectively block input from multiple keyboards 以了解如何做到这一点(使用鼠标挂钩而不是键盘挂钩)。
我还希望监视键盘和剪贴板类型的事件(当鼠标离开屏幕时抑制,控制我的程序)
您也可以使用 RawInput API 来观察键盘活动,但不要阻止它。为此使用SetWindowsHookEx()
。
对于剪贴板事件,您需要使用AddClipboardFormatListener()
(Vista 及更高版本)或SetClipboardViewer()
(XP 及更早版本)。有关详细信息,请参阅 MSDN 上的Monitoring Clipboard Contents。
但是,这只允许您检测剪贴板何时发生更改,但没有 API 方法可以阻止剪贴板更改(您必须在每个正在运行的进程中直接挂钩 SetClipboardData()
和 OleSetClipboard()
函数)。
【讨论】:
以上是关于C# 挂钩以获取原始鼠标/键事件的主要内容,如果未能解决你的问题,请参考以下文章