如何检测是不是在 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 中按下了动态添加的按钮之一? [复制]