Низкоуровневая клавиатура и клавиши от 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);
}

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

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

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

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

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

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

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

Ответы на вопрос(3)

Ваш ответ на вопрос