如何在 Windows 上使用 C++ 监听终端外的击键

Posted

技术标签:

【中文标题】如何在 Windows 上使用 C++ 监听终端外的击键【英文标题】:How to listen for key stroke outside terminal with C++ on Windows 【发布时间】:2020-08-24 05:15:04 【问题描述】:

我是编程新手,目前我正在使用此代码来监听我的击键:

#include <windows.h>
#include <stdio.h>

int main()

    while (1)
    
        HANDLE hInput = GetStdHandle(STD_INPUT_HANDLE);
        DWORD NumInputs = 0;
        DWORD InputsRead = 0;
        bool running = true;

        INPUT_RECORD irInput;

        GetNumberOfConsoleInputEvents(hInput, &NumInputs);

        ReadConsoleInput(hInput, &irInput, 1, &InputsRead);

        switch (irInput.Event.KeyEvent.wVirtualKeyCode)
        
        case VK_F1:
            puts("F1");
            break;
        case VK_F2:
            puts("F2");
            break;

        case VK_F3:
            puts("F3");
            break;

        case VK_F4:
            puts("F4");
            break;
        
    

但是,即使我的终端没有焦点,我也需要一个事件监听器。这可能吗?

【问题讨论】:

通过SetWindowsHookEx()RegisterRawInputDevices()使用键盘钩子 根据您的用例,RegisterHotKey 可能是一个解决方案。 【参考方案1】:

您可以将SetWindowsHookExAWH_KEYBOARD_LL 一起使用。

并为这个钩子设置对应的钩子函数,对应你需要的键。

这是你可以在没有焦点的情况下听键盘的示例:

#include <windows.h>
#include <stdio.h>
HHOOK _k_hook;
LRESULT __stdcall k_Callback1(int nCode, WPARAM wParam, LPARAM lParam)

    PKBDLLHOOKSTRUCT key = (PKBDLLHOOKSTRUCT)lParam;
    //a key was pressed
    if (wParam == WM_KEYDOWN && nCode == HC_ACTION)
    
        switch (key->vkCode)
        
        case VK_F1:
            puts("F1");
            break;
        case VK_F2:
            puts("F2");
            break;

        case VK_F3:
            puts("F3");
            break;

        case VK_F4:
            puts("F4");
            break;
        
    

    return CallNextHookEx(NULL, nCode, wParam, lParam);



int main()

    _k_hook = SetWindowsHookExA(WH_KEYBOARD_LL, k_Callback1, NULL, 0);
    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0) != 0)
    

    
    if (_k_hook)
        UnhookWindowsHookEx(_k_hook);
    return TRUE;

【讨论】:

您好,如果这个答案对您有帮助,请随时标记它以帮助遇到相同问题的人,如果您有任何问题,请告诉我。谢谢。

以上是关于如何在 Windows 上使用 C++ 监听终端外的击键的主要内容,如果未能解决你的问题,请参考以下文章

如何使用终端监听音量键事件?

能够打开 TCP 端口但不能监听

如何隐藏在 Qt 应用程序中打开的 Windows 终端?

C++ Win32 监听全局键绑定

如何在 XCode 中创建 C++ 控制台/终端项目?

Java中如何在windows桌面上添加鼠标监听事件