Низкоуровневая клавиатура и клавиши от rawinput

В настоящее время я делаю программу, которая перехватывает нажатия клавиш с определенной клавиатуры (фильтруется с использованием HID). Чтобы узнать, какие нажатия клавиш были отправлены определенным устройством, я использовал технику RawInput, вдохновленную этим замечательным учебником:

http://www.codeproject.com/Articles/17123/Using-Raw-Input-from-C-to-handle-multiple-keyboard

Теперь это прекрасно работает: я могу получить нажатие клавиши и узнать, какая клавиатура его сгенерировала.

Сложная часть моего проекта - перехватывать и блокировать нажатия клавиш на этой конкретной клавиатуре, чтобы эти нажатия клавиш не попадали в целевое приложение (сфокусированное означает окно переднего плана, отображаемое ОС).

Таким образом, естественным решением был глобальный хук низкого уровня для всех текущих потоков, имеющих дескриптор окна.

Я использовал и адаптировал код с этой страницы, чтобы сделать это:

http://blogs.msdn.com/b/toub/archive/2006/05/03/589423.aspx

Я создал новый проект в визуальной студии, чтобы избежать беспорядка в моей работе. После некоторых исследований я смог блокировать нажатия клавиш во всех приложениях, возвращая значение (-1) в функции обратного вызова:

private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)  
{
//Check if we have a key to pass

if (
    nCode >= 0 && ( 
    (wParam == (IntPtr)WM_KEYDOWN) || (wParam == (IntPtr)WM_KEYUP) ) 
    )
{
    int vkCode = Marshal.ReadInt32(lParam);
    if ((Keys)vkCode == Form1.KeysToIgnore)
    {
        return (IntPtr)(-1);
    }
}
return CallNextHookEx(_hookID, nCode, wParam, lParam);
}

Чтобы соединить все вместе (процедура подключения и обнаружение нажатия клавиш), я создаю два потока в конечном проекте:

1-е: использование RawInput для идентификации и присоединения каждого нажатия клавиши на устройстве

2-й: используется для перехвата всех окон и блокировки определенных нажатий клавиш

Поток 1 предназначен для отправки нажатия клавиши в блок в поток 2, который считывает все сообщения, отправленные всем оконным приложениям, и нажатия клавиш корзины с определенной клавиатуры. Я точно, что эти две темы синхронизированы.

Проблема в том, что ловушка, кажется, выполняется перед выполнением Rawinput, поэтому я не могу определить клавиатуру, которая послала нажатие клавиши. Я понятия не имею, как это сделать, может быть, чтобы изменить тип хука (избегайте использования низкоуровневого хука клавиатуры, но используя хук клавиатуры уровня пользователя).

Или может кто-то знает умный способ сделать то, что я хочу?

Я знаю, что этот запрос действительно сложный, не стесняйтесь спрашивать более подробную информацию.

3 ответа

Решение

Хорошо, Silence Dogood дает мне хорошую подсказку:

Библиотека Interception идеально подходит для моего использования. Вы можете найти это здесь:

https://github.com/oblitum/Interception

Я пытаюсь сделать то же самое, чтобы сканеры штрих-кодов (которые используют скрытую эмуляцию клавиатуры) были красными программным обеспечением и не использовались в качестве входных данных.

Я нашел это, но я не очень хорошо знаю, как его использовать, так как это не полный код, и я новичок в C#, надеюсь, я могу помочь вам помочь мне:

Перехват клавиатуры

Если вы реализуете это в приложении.net, я лично рекомендую EasyHook, это позволит вам сделать гораздо больше, чем просто перехватывать нажатия клавиш, и его очень просто использовать.

Другие вопросы по тегам