c++ - 使用键盘 Hook 时无法动态退出循环

标签 c++ winapi visual-c++ keyboard-hook

我在使用键盘钩子(Hook)时遇到一些关于退出“while”循环的问题。这是我的代码:

LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    PKBDLLHOOKSTRUCT key = (PKBDLLHOOKSTRUCT)lParam;
    if (wParam == WM_KEYDOWN && nCode == HC_ACTION)
    {

    }

    if (wParam == WM_KEYUP)
    {
        if (key->vkCode == VK_CAPITAL) {
            capslockState = GetKeyState(VK_CAPITAL) & 0x0001;
            myLoop(capslockState);
        }
    }
    return CallNextHookEx(keyboardHook, nCode, wParam, lParam);
}

这是我的功能:

int myLoop(int a) {
    while (a == 1) {
        for (i = 0; i < n; i++) {
            // do some stuff
        }
        if (a == 0) {
            break;
            return 0;
        } 
        else {
            i = 0;
        }
    }
}

我尝试了更多方法来实现我的目标,但我做不到。我的目标是:我想打开程序,无论 Caps Lock 是开还是关,如果我按下 Caps Lock,它就会开始我的循环,如果我再次按下它,它就会停止。不知何故,我能够使用大量的“while”循环和线程来完成它,但它几乎耗尽了我所有的 CPU 能力。如何在使用键盘输入时创建性能友好的动态循环? 谢谢。

最佳答案

My goal is: I want to open the program, doesn't matter if Caps Lock is on or off, if I hit Caps Lock, it'll start my loop and if I hit it again, it'll stop.

您可以检查以下代码以查看其是否有效。

LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    if (nCode < 0)  // do not process message 
        return CallNextHookEx(NULL, nCode,
            wParam, lParam);

    if (wParam == VK_CAPITAL) {

        if(hThread == NULL)
            hThread = CreateThread( NULL, 0, myLoop, NULL, 0, NULL); 

        if (capslockState)
            capslockState = 0;
        else
            capslockState = 1;
    }

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

DWORD WINAPI myLoop(LPVOID lpParam)
{
    while (1) {
        for (UINT16 i = 0; (i < n && capslockState == 1); i++) {
            // do some stuff
        }
        Sleep(100);
    }
    return 0;
}

我对您的代码所做的主要修改:

  1. 为了让主线程可以响应消息并保持你的 for 循环,你需要创建一个新线程(CreateThread)来运行你的 for 循环。
  2. 因为您“Caps Lock 是开还是关都无关紧要”,所以无需检查 Capslock 是否是 on or off state .
  3. 要检查按下的是哪个键,请使用 wParamvirtual-key code 比较.
  4. 其他人指出的问题。

更多引用“Using Hooks

关于c++ - 使用键盘 Hook 时无法动态退出循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53982918/

相关文章:

c++ - qt 中标题的组框对齐不起作用。为什么?

c++ - 为什么 BitBlt 没有复制正确的部分

c++ - 使用 SendMessage 获取垃圾来填充列表框

c++ - 当前渲染视频卡

c++ - 简单的 std::sort 不工作

c++ - main.cpp 如何知道包含头文件的源文件?

c++ - 用户定义的重载运算符 * 与 std::chrono::duration

c++ - 需要了解良好的 C++ 反射 API(用于 RuntimeType Identification -RTTI 和运行时调用)

winapi - 如何获取与 Windows 主题关联的图标?

c++ - std::priority_queue<> 什么时候进行 self 排序?