Могу ли я использовать глобальные перехваты и необработанный ввод одновременно?

#.net #winapi #hook #keyboard-hook #setwindowshookex

#.net #winapi #перехват #клавиатура-перехват #setwindowshookex

Вопрос:

Я попытался использовать глобальные перехваты, используя SetWindowsHookEx для получения всех нажатий клавиш.

Проблема в том, что я не могу использовать глобальные перехваты и необработанный ввод одновременно.

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

Комментарии:

1. могу ли я изменить нажатие клавиши без setwindowex(), просто используя необработанный ввод??

Ответ №1:

Кто вам сказал, что их нужно использовать вместе? Если ваше приложение зарегистрировано для обработки необработанного ввода, нет абсолютно никаких причин устанавливать глобальный перехват. Весь смысл модели необработанного ввода заключается в том, чтобы приложение получало уведомления и обрабатывало необработанный ввод от любого HID, подключенного к компьютеру.

Вместо этого вы прослушиваете WM_INPUT сообщение, которое отправляется в очередь сообщений приложения для любого HID, который вы зарегистрировали, вызвав RegisterRawInputDevices функцию. После получения этого сообщения ваше приложение должно вызвать GetRawInputData функцию, используя RAWINPUT дескриптор, содержащийся в lParam параметре WM_INPUT сообщения. Пример кода доступен здесь.

В качестве альтернативы вы можете выполнить буферизованное чтение необработанных данных. Это более полезно для устройств, которые генерируют большие объемы ввода одновременно. При таком подходе вызывается GetRawInputBuffer функция, которая возвращает массив RAWINPUT структур. Опять же, пример кода доступен здесь.

Актуальное чтение по необработанным функциям ввода находится здесь, в MSDN.

Комментарии:

1. раньше я использовал gloabalhook для изменения некоторых клавиш клавиатуры, а теперь хочу использовать необработанный ввод для получения имени устройства ввода (чтобы знать, какое из них отправляет данные). но когда я использую rawinput, глобальные перехваты отключаются!

2. @raha: Я не понимаю, о чем вы говорите, и я не уверен, насколько яснее я мог бы сформулировать свой ответ. Необработанный ввод и глобальные перехваты несовместимы, и нет никаких причин, по которым вам когда-либо понадобится использовать их вместе. Если вы зарегистрировали свое приложение для получения необработанного ввода с устройства, вам не нужен глобальный перехват. Вы будете уведомлены о вводе через WM_INPUT сообщение. Они происходят на совершенно разных уровнях. Необработанный ввод обрабатывается раньше, чем глобальный перехват.

3. могу ли я подключить клавиатуру к необработанному вводу? значит, когда я использую rawinput, я никогда не могу подключить клавиатуру? это верно?

4. @raha: Дело в том, что регистрация вашего приложения для получения необработанного ввода с устройства функционально эквивалентна установке глобального перехвата. Вы будете получать WM_INPUT сообщение каждый раз, когда устройство отправляет входные данные на компьютер, точно так же, как вы получили бы уведомление, если бы установили глобальный перехват. Единственное отличие заключается в том, что входные данные, которые вы получаете, находятся на более низком уровне (необработанные), чем это было бы из глобального перехвата. Нет причин также подключать клавиатуру, вы уже получаете это, когда получаете уведомления о необработанном вводе.

5. извините, я думаю, что не совсем понимаю это, позвольте мне сказать вам, почему я использую keyboardhook. я получаю ключ, подобный A, и отправляю B вместо этого (если e.keyCode==ключи. Система. Windows. Формы. Клавиши отправки. Send(B);) для этого сначала я должен перехват A.

Ответ №2:

Вам не нужен перехват для необработанного ввода, который уже проверен обратным вызовом LRESULT WindowProcedure. Вам просто нужно получить информацию обратно, если устройство использовалось как mouse_pos, mouse_click (и его количество нажатий, которое вы можете определить с помощью счетчика), key_input и т.д…