簡體   English   中英

在 Windows 上啟用 LowLevelKeyboardProc 掛鈎時,SendInput 無法發送鍵盤輸入

[英]SendInput can't send keyboard inputs when the LowLevelKeyboardProc hook is enabled on Windows

我制作了一個程序,它將使用 WinAPI 阻止 Windows 上的每個鍵盤按鈕,並使用 SendInput 函數發送一個字符串,但我找不到在啟用鈎子時讓 SendInput 發送鍵盤鍵的方法。 這是我的代碼:

#include <Windows.h>
#include <vector>
#include <string>

HHOOK kHook;
KBDLLHOOKSTRUCT kbdStruct;

LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) {
    kbdStruct = *((KBDLLHOOKSTRUCT*)lParam);
    if (nCode == HC_ACTION)
    {
        if (kbdStruct.flags != LLKHF_INJECTED)
        {
            switch (wParam)
            {
            case WM_KEYDOWN:
                return -1;
            case WM_SYSKEYDOWN:
                return -1;
            }
            return CallNextHookEx(kHook, nCode, wParam, lParam);
        }
    }
}

void sendString(std::wstring message)
{
    for (auto ch : message)
    {
        Sleep(250);
        std::vector<INPUT> vec;
        INPUT input = { 0 };
        input.type = INPUT_KEYBOARD;
        input.ki.dwFlags = KEYEVENTF_UNICODE;
        input.ki.wScan = ch;
        vec.push_back(input);

        input.ki.dwFlags |= KEYEVENTF_KEYUP;
        vec.push_back(input);

        SendInput(vec.size(), vec.data(), sizeof(INPUT));
    }
}
int main()
{
    kHook = SetWindowsHookExW(WH_KEYBOARD_LL, LowLevelKeyboardProc, NULL, 0);
    MSG msg;
    while (GetMessageW(&msg, NULL, 0, 0))
    {
        sendString(L"Some String");
    }
}

根據文檔KBDLLHOOKSTRUCT ( LLKHF_INJECTED ) 中有一個標志,它告訴您事件是否被“注入”,因此,如果運氣好的話,您可以對其進行測試並傳遞它。

另請注意,您 hook proc 並沒有做正確的事情。 如果您閱讀此頁面,您會發現如果nCode為負數,您應該始終傳遞事件,因此您應該添加它。

我不寒而栗地想到你為什么要這樣做,但是,嘿。

不要吞下所有鍵盤輸入(這顯然與您發送一些鍵盤輸入的意圖相沖突),而是嘗試過濾輸入。

現在,您的鍵盤鈎子會停止所有輸入,包括您在sendString中發送的消息。 更改您的鍵盤掛鈎,以便它了解允許傳遞的消息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM