Низкоуровневая клавиатура и клавиши от 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, поэтому я не могу определить клавиатуру, которая послала нажатие клавиши. Я понятия не имею, как это сделать, возможно, чтобы изменить тип хука (избегайте использования низкоуровневого хука клавиатуры, но используя хук клавиатуры уровня пользователя).

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

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

 Louisbob26 окт. 2012 г., 17:50
Выглядит очень, очень мило. Я буду копать таким образом, спасибо!
 Silence Dogood26 окт. 2012 г., 14:53
Рассматривали ли вы использование библиотеки перехвата?oblita.com/Interception.html

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

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

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

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

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

Решение Вопроса

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

https://github.com/oblitum/Interception

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