低级鼠标钩子和 DirectX
Posted
技术标签:
【中文标题】低级鼠标钩子和 DirectX【英文标题】:Low level mouse hook and DirectX 【发布时间】:2010-07-11 14:37:52 【问题描述】:我正在构建一个需要在系统范围内过滤一些鼠标点击的应用程序。也就是说,我需要让系统在特殊情况下忽略一些鼠标按键的点击。
我使用低级鼠标钩子和SetWindowsHookEx
过滤掉这些点击。除了WPF
应用程序外,它工作得相对较好。我猜这是因为这些应用程序使用DirectX
和DirectInput
进行输入处理,这就是为什么我无法过滤掉这些应用程序中的点击,因为它们直接从驱动程序获取输入。
有什么方法可以过滤WPF
/DirectX
应用程序中的点击吗?
我知道全局过滤点击通常不是一个好主意,但这对我的应用程序至关重要,我会确保它不会在游戏和其他程序中被过滤。但是WPF
应用程序有普通的GUI
,所以我还需要过滤它们中的点击。
更新
我想我可以通过编写自己的过滤驱动程序来解决这个问题,但是由于我没有编写驱动程序的经验,如果有其他解决方案,请告诉我。
API 挂钩资源
我发现了一些有关 API 挂钩的有用链接。以此作为参考。
Hooking Windows APIAPI hooking revealedAPI hooking revealed Part 2Hijack Textout Calls From NotepadmadCodeHookIAT Function Hooking
最终解决方案
WPF does not use DirectInput, but standard Win32 messages for input handling(除了手写笔,它是我所有问题的根源,因为我使用手写笔进行开发,我不知道 WPF 应用程序支持手写笔)。但是,对于使用 DirectInput 的应用程序中的过滤点击,必须挂钩 API,正如接受的答案所解释的那样。
【问题讨论】:
【参考方案1】:您可以使用一种称为 API 挂钩的方法 - 您覆盖对库函数的特定调用并赋予它们您自己的行为。有许多挂钩库可以简化此任务,最常用的是: * Microsoft Detours * MadCodeHook * Deviare API Hook * API Hijack
另见Wikipedia example of hooking Direct3D。 您只需将挂钩库插入系统中的每个进程,但从您的问题来看,我假设您已经实现了。
【讨论】:
我实际上使用WH_MOUSE_LL
,它不需要它自己的.dll
。不过,这实际上是一个非常好的主意!但我需要学习DirectX
和DirectInput
,才能挂钩正确的功能。 :-(
而且我不知道WPF
是否真的使用DirectInput
或XInput
,所以我可能需要同时挂钩。
是的,您必须找出要在 DirectInput 和 XInput 中挂钩的函数,但我猜这应该不会花费太多时间,Google 就在您身边。我从来没有直接使用过 DirectInput/XInput,所以在这里没有任何帮助。以上是关于低级鼠标钩子和 DirectX的主要内容,如果未能解决你的问题,请参考以下文章