Как игнорировать вводимые данные только в одном окне? - PullRequest
0 голосов
/ 13 октября 2019

У меня есть два устройства, которые создают ввод с клавиатуры, одно из которых является настоящей клавиатурой, а другое использует 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);
            }   
    }

Любые идеи, как я могу игнорировать введенное сообщение только в главном окне и пропустить его до остальной частисистема

1 Ответ

0 голосов
/ 14 октября 2019

Вы можете использовать RAW INPUT в целевом окне и обработать сообщение WM_INPUT, а затем получить необработанный входной буфер через GetRawInputData.

...