【问题标题】:How to listen for key stroke outside terminal with C++ on Windows如何在 Windows 上使用 C++ 监听终端外的击键
【发布时间】: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 可能是一个解决方案。

标签: c++ windows winapi


【解决方案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;
}

【讨论】:

  • 您好,如果这个答案对您有帮助,请随时标记它以帮助遇到相同问题的人,如果您有任何问题,请告诉我。谢谢。
猜你喜欢
  • 2021-06-16
  • 1970-01-01
  • 1970-01-01
  • 2019-12-29
  • 2014-10-25
  • 2012-09-02
  • 1970-01-01
  • 2021-12-16
  • 1970-01-01
相关资源
最近更新 更多