C#试图获取原始鼠标/键事件

时间:2018-12-19 05:48:53

标签: winapi mouseevent mouselistener

让我看看我是否可以描述我要做什么。当前,鼠标仅限于仅在屏幕尺寸范围内移动。我想删除此限制,并允许鼠标​​继续在边界之外(理论上是无限的),并让它控制正在构建的程序中的各个方面,但是当鼠标移回屏幕尺寸时,将其返回屏幕。所以我的想法是,一旦鼠标到达并突破屏幕边缘,我的程序将开始抑制发送鼠标消息(以及键盘/剪贴板消息),但随后继续监视原始鼠标(以及键盘/剪贴板) )增量从那时开始一直变化,直到回到屏幕范围内。

我已经有了一个使用SetWindowsHookEx()并返回低级鼠标事件(例如WM_MOUSEMOVE)的有效示例,但是,返回的结构(MSLLHOOKSTRUCT)似乎不够低,无法满足我的要求寻找作为此示例返回屏幕的X和Y坐标,但我需要更接近于增量而不是“渲染”坐标的东西。从文档看来,我似乎需要RAWMOUSE数据。有很多有关RAWMOUSE数据类型的文档,但没有太多有关如何获取此类消息的文档。

也如前所述,我还希望监视键盘和剪贴板类型的事件(以抑制鼠标不在屏幕上,从而控制程序),因此,如果有更好的方法可以正确挂接这些事件,监视/抑制,但听起来好像我并不一定需要键盘和剪贴板事件作为原始数据,因为键盘和剪贴板没有像鼠标一样可以突破的范围。但是我认为键盘/剪贴板抑制不在我当前问题的范围内,但是如果该解决方案碰巧也可以解决该问题,将很有帮助。

1 个答案:

答案 0 :(得分:0)

  

关于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()函数运行过程中。)