Reputation: 66573
I am using the Raw Input API because I need to be able to respond to keys from different USB HID devices differently, even if it is the same key.
My window receives the WM_INPUT
messages correctly. I can retrieve the RAWKEYBOARD
structure to obtain all the information I need.
Now I want to prevent those USB devices from being able to toggle NumLock. I am hoping that the Raw Input API might allow me to swallow the NumLock keypress?
I’ve tried setting the WM_INPUT message’s Result to 1, but that doesn’t seem to have an effect.
(I am writing this in C#, but since this is all low-level Windows API, you probably don’t need knowledge of C# or .NET to answer this.)
EDIT: Oh yeah, I’ve also tried using a global keyboard hook (SetWindowsHookEx
) to swallow the NumLock keypress. Unfortunately, as soon as I initialize the Raw Input API, the global keyboard hook is no longer called while the window is active. I’ve also tried setting the global hook after the Raw Input one, but same effect.
Upvotes: 5
Views: 4206
Reputation: 1539
As written above, there is no direct possibility, but you can make it by combining low-level keyboard hooks.
In my case, I need to catch code from barcode scanner so that's only digits and ENTER.
My solution is that RawInput captures all keys only from barcode scanner device, and keyboard hookup captures only digits 0-9 and ENTER and does not return it at all. Then, inside the code, I'm deciding whether key needs to be returned or not by:
SendKeys.SendWait("{ENTER}");
Upvotes: 0
Reputation: 66573
The Raw Input API does not support swallowing of keypresses.
Furthermore, it does not interact with SetWindowsHookEx
within the same process. As soon as the Raw Input API is initialized, the hook is unhooked.
The solution is to have them in separate processes. One process can use SetWindowsHookEx
to swallow the unwanted keys, while another uses the Raw Input API to process the keypresses that do come through. Then you just run both. This worked just fine for me.
Upvotes: 5
Reputation: 693
You can "swallow" some key-press only by writing a kernel keyboard filter driver. So, if you are still in that you'll need a DDK.
Upvotes: -2