如何检测是不是在 C++ 中按下了除特定键盘键之外的任何键盘键?

Posted

技术标签:

【中文标题】如何检测是不是在 C++ 中按下了除特定键盘键之外的任何键盘键?【英文标题】:How to detect if any keyboard key other than a specific keyboard key has been pressed in C++?如何检测是否在 C++ 中按下了除特定键盘键之外的任何键盘键? 【发布时间】:2018-03-31 07:34:09 【问题描述】:

我有以下代码可以正常工作。

int x = 0;
int main()
    
    while(true)    
        if (GetKeyState('A') & 0x8000 && x == 0) 
            Sleep(500);
            x = 1;
        
        else if (GetKeyState('B') & 0x8000 && x == 1) 
            Sleep(500);
            x = 2;
        
        else if (GetKeyState('C') & 0x8000 && x == 2) 
            Sleep(500);
            x = 0;
            //Do Something
        
    

为了执行代码的//Do Something 部分,用户必须先按A,然后按B,然后按此顺序按C。但是,用户可以在两者之间按下任何键,它仍然可以工作。因此,除了 "A+B+C" 之外,以下内容也可以使用。

    A+C+B+C A+Q+B+C A+F11+B+8+LSHIFT+Spacebar+Tab+C

我只希望 A+B+C 组合起作用。以上都不是。

我尝试实现的代码有点像这样

int x = 0;
int main()

    while(true) 

        if (GetKeyState('A') & 0x8000 && x == 0) 
            Sleep(500);
            x = 1;
        
        else if (GetKeyState('B') & 0x8000 && x == 1) 
            Sleep(500);
            x = 2;
        
        else if (GetKeyState(/*Any keyboard input other than 'B' or 'A'*/) & 0x8000 && x == 1) 
            Sleep(500);
            x = 0;
        
        else if (GetKeyState('C') & 0x8000 && x == 2) 
            Sleep(500);
            x = 0;
            //Do Something
        
        else if (GetKeyState(/*Any keyboard input other than 'C' or 'B'*/) & 0x8000 && x == 2) 
            Sleep(500);
            x = 0;
        
    

所以你看我理解所需的逻辑。我只是不知道替换代码的注释部分所需的正确代码。请注意,我在 cmets 中输入了两个键的原因是因为用户可能不小心按了两次或三次,因此他/她需要被原谅并且代码仍然可以工作。

我想我已尽力使这个问题尽可能容易理解。如果不能随意提出修改建议。

【问题讨论】:

什么是GetKeyState 你不能使用一个状态机或两个布尔标志,在分别按下'A''B''C'时依次启用? 你认为 if 语句中的 x == 1(或 0 或 2)有什么作用?它们是用来做什么的?我想当你回答我的问题时,你会更接近找到自己问题的答案。 :] 你的意思是在最后只使用一个普通的 else 子句。 GetKeyState() 不适合在控制台模式应用程序中使用,它与消息队列同步,而控制台模式应用程序没有。使用 ReadConsoleInput() 正确执行此操作,无需 Sleep 调用。 【参考方案1】:

在 Windows 上,为简单起见,您可以使用 _kbhit(),除非有特定原因要使用 GetKeyState

#include <iostream>
#include <conio.h>  

int main()

    int x = 0;
    while (true)
    
        if (!_kbhit())
            continue;

        switch (_getch())
        
        case 'A':
            x == 0 ? ++x : x = 0;
            break;
        case 'B':
            x == 1 ? ++x : x = 0;
            break;
        case 'C':
            x == 2 ? ++x : x = 0;
            break;
        default:
            x = 0;
        

        if (x == 0)
            std::cout << "Oops!" << std::endl;
        else if (x == 3)
        
            std::cout << "Bingo!" << std::endl;
            break;
        
    

【讨论】:

以上是关于如何检测是不是在 C++ 中按下了除特定键盘键之外的任何键盘键?的主要内容,如果未能解决你的问题,请参考以下文章

检测是不是在 C# 中按下了任何键(不是 A、B,而是任何键)

检测是不是在 KeyRoutedEventArgs 事件中按下了修饰键

如何检测在 PyQt5 中按下了动态添加的按钮之一? [复制]

如何检测是不是在 HTML 页面上的任意位置按下了某个键?

如何检测 Actionscript 3 中是不是按下了删除键?

如何使用 Ruby 检测在 Windows 平台上是不是按下了 SHIFT 或 ALT 键?