Low level mouse hook and DirectX
Asked Answered
R

1

10

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 Calls From Notepad
madCodeHook
IAT Function Hooking

FINAL 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.

Rottweiler answered 11/7, 2010 at 14:37 Comment(0)
H
6

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.

Hosfmann answered 22/8, 2010 at 16:57 Comment(3)
I actually use WH_MOUSE_LL, which does not need it's own .dll. Nevertheless, this is actually a very good idea! But I will need to learn DirectX and DirectInput, to hook the right functions. :-(Rottweiler
And I don't know if WPF actually uses DirectInput or XInput, so I will probably need to hook both.Rottweiler
Yes, you will have to find out which functions to hook in DirectInput and XInput but that shouldn't take much time I guess, Google is on your side. I have never used DirectInput/XInput directly so can't be of any help here.Hosfmann

© 2022 - 2024 — McMap. All rights reserved.