按住 CTRL 按钮的 GetAsyncKeyState 和另一个 "toggled" 按钮无法正常工作

GetAsyncKeyState with held CTRL button and another "toggled" button not working as wanted

我得到以下代码用于测试:

bool test = false;
if (GetAsyncKeyState(VK_LCONTROL) && GetAsyncKeyState(VK_F2) & 1) {
    test = !test;
    std::cout << test << std::endl;
}

现在我想要发生的事情是,当我按住左控件然后按 F2 时,说明正在正确处理指令。 问题是,如果我按住 LCTRL 然后按 F2,或者当我按住 F2 然后按 LCTRL,或者当我按 LCTRL 然后按 F2,或者当我按 F2 然后按 LCTRL 时,条件变为真。所以无论按哪个按钮的哪个组合,我使用条件总是为真。

我希望你们中的一些人在某个时候遇到过这个问题,并且可以提供一些非常感谢的见解。

GetAsyncKeyState return 在其 return 值中有多个内容。检查按键是否按下的正确方法是:bool lctrldown = GetAsyncKeyState(VK_LCONTROL) < 0;

也就是说,等待用户按 F2 意味着轮询,而轮询是错误的!如果你只关心 F2 在你自己的 window 那么你应该在你的消息循环中使用 TranslateAccelerator 或者处理 WM_KEYDOWN.

对于全局解决方案,请使用 RegisterHotKey or a low-level keyboard hook

WM_KEYDOWN 或挂钩的情况下,当您收到有关 F2 的通知时,您应该使用 GetAsyncKeyState 检查控制键的状态.