У меня есть два устройства, которые создают ввод с клавиатуры, одно из которых является настоящей клавиатурой, а другое использует SendInput () для отправки ввода с клавиатуры. Я модифицирую существующую программу, которая использует ловушку для отправки сообщения клавиатуры только в собственное окно и блокирует ввод глобально другим программам. Однако я не хочу, чтобы ввод был заблокирован, и я также не хочу, чтобы программа обрабатывала ввод.
Я использовал хук WH_KEYBOARD_LL, чтобы определить, введен ли ввод, затем я использовал глобальный хук WH_KEYBOARD, чтобы отправить сообщение только окну, если это настоящая клавиатура. То, что я ищу, это способ sendMessage () для всего, кроме главного окна. Я не смог найти метод в документации, чтобы сделать это, поэтому я решил передать хук дальше.
// WH_KEYBOARD
static LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam) {
if (code < 0) {
return CallNextHookEx(hookHandle, code, wParam, lParam);
}
//Report the event to the main window, but do not pass it to the hook chain
if (realKeyboard) {
SendMessage(hwndServer, WM_HOOK, wParam, lParam);//only listen to real keyboard, block emulated one
}
else {
//what i want is to sendMessage to everythng except the main window
return CallNextHookEx(hookHandle, code, wParam, lParam); //let injected keyboard passthrough
//however we want to ignore injected inputs in the main window(keyboard program).
}
return 1;
}
Я создал локальный хук WH_GETMESSAGE, используя GetCurrentThreadId (), чтобы посмотреть, смогу ли яигнорируйте введенный там ввод.
// WH_GETMESSAGE
static LRESULT CALLBACK GetMessageProc(int code, WPARAM wParam, LPARAM lParam) {
if (code < 0) {
return CallNextHookEx(hookHandle, code, wParam, lParam);
}
if (!realKeyboard) {
MSG * info = (MSG *)lParam;
info->message = WM_NULL;
}
return CallNextHookEx(hookHandle, code, wParam, lParam);
}
Я где-то читал, что info-> message = WM_NULL;будет работать, чтобы заблокировать сообщение, но это, кажется, не имеет никакого эффекта. Я также пытался создать цикл сообщений примерно так, но он тоже не работал.
while (PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) {
if(IsRealKeyboard()){
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
Любые идеи, как я могу игнорировать введенное сообщение только в главном окне и пропустить его до остальной частисистема