让我看看我是否可以描述我要做什么。当前,鼠标仅限于仅在屏幕尺寸范围内移动。我想删除此限制,并允许鼠标继续在边界之外(理论上是无限的),并让它控制正在构建的程序中的各个方面,但是当鼠标移回屏幕尺寸时,将其返回屏幕。所以我的想法是,一旦鼠标到达并突破屏幕边缘,我的程序将开始抑制发送鼠标消息(以及键盘/剪贴板消息),但随后继续监视原始鼠标(以及键盘/剪贴板) )增量从那时开始一直变化,直到回到屏幕范围内。
我已经有了一个使用SetWindowsHookEx()并返回低级鼠标事件(例如WM_MOUSEMOVE)的有效示例,但是,返回的结构(MSLLHOOKSTRUCT)似乎不够低,无法满足我的要求寻找作为此示例返回屏幕的X和Y坐标,但我需要更接近于增量而不是“渲染”坐标的东西。从文档看来,我似乎需要RAWMOUSE数据。有很多有关RAWMOUSE数据类型的文档,但没有太多有关如何获取此类消息的文档。
也如前所述,我还希望监视键盘和剪贴板类型的事件(以抑制鼠标不在屏幕上,从而控制程序),因此,如果有更好的方法可以正确挂接这些事件,监视/抑制,但听起来好像我并不一定需要键盘和剪贴板事件作为原始数据,因为键盘和剪贴板没有像鼠标一样可以突破的范围。但是我认为键盘/剪贴板抑制不在我当前问题的范围内,但是如果该解决方案碰巧也可以解决该问题,将很有帮助。
答案 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()
函数运行过程中。)