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