使用键盘挂钩时无法动态退出循环

时间:2018-12-31 01:57:58

标签: c++ winapi visual-c++ keyboard-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能力。使用键盘输入时如何创建性能友好的动态循环?   谢谢。

1 个答案:

答案 0 :(得分:1)

  

我的目标是:我想打开程序,无论Caps Lock是否为   开启或关闭,如果我按了Caps Lock,它将开始我的循环,如果我按了它   再次,它将停止。

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

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