I'm building an application which needs to filter some mouse clicks system-wide. That is, I need to make the system ignore some mouse button clicks at special occasions.
I use low level mouse hook and SetWindowsHookEx
to filter out these clicks. It works relatively well, except for WPF
applications. I guess that's because these applications use DirectX
and DirectInput
for input processing, and that's why I can't filter out clicks in these applications, since they get the input directly from the driver.
Is there any way how to filter clicks in WPF
/DirectX
applications?
I know it is generally not good idea to globally filter clicks, but it is crucial for my application, and I will make sure that it is not filtered in games and other programs. But WPF
applications have ordinary GUI
, so I need to filter clicks in them as well.
Update
I guess I could solve this problem by writing my own filtering driver, but since I don't have any experience in writing drivers, please let me know if there is any other solution.
API Hooking Resources
I've found some helpful links regarding API hooking. Use this as a reference.
Hooking Windows API
API hooking revealed API hooking revealed Part 2 Hijack Textout C开发者_如何转开发alls From Notepad madCodeHook IAT Function HookingFINAL SOLUTION
WPF does not use DirectInput, but standard Win32 messages for input handling (except for stylus, which is the source for all problems for me, because I use stylus for development, and I wasn't aware WPF apps are stylus-aware). However for filtering clicks in apps that use DirectInput, one would have to hook API, as the accepted answer explains.
You could use a method called API hooking - you override specific calls to library functions and give them your own behavior. There are many hooking libraries out there that simplify this task, the most used ones are:
* Microsoft Detours
* MadCodeHook
* Deviare API Hook
* API Hijack
Also see Wikipedia example of hooking Direct3D.
You just need to insert your hooking library into each process in the system but judging from your question I assume you've already achieved that.
精彩评论