如何仅在一个窗口中忽略注入的输入?

问题描述 投票:-1回答:1

我有两个创建键盘输入的设备,其中一个是真实的键盘,另一个使用SendInput()发送注入的键盘输入。我正在修改一个现有的程序,该程序使用钩子将键盘消息仅发送到其自己的窗口,并全局阻止其他程序的输入。但是,我不想阻止Injected输入,也不想让程序处理Injected输入。

我使用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; 
}

我使用GetCurrentThreadId()创建了一个本地WH_GETMESSAGE挂钩,以查看是否可以忽略那里的注入输入。

// 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);
            }   
    }

任何想法,我如何只能在主窗口中忽略注入的消息,然后将其传递到系统的其余部分?

c++ winapi dll hook sendmessage
1个回答
0
投票

您可以在目标窗口中使用RAW INPUT并处理WM_INPUT消息,然后通过GetRawInputData获取原始输入缓冲区。

© www.soinside.com 2019 - 2024. All rights reserved.