如何检测 C++ 中的组合键输入?

Posted

技术标签:

【中文标题】如何检测 C++ 中的组合键输入?【英文标题】:How to detect combined key input in C++? 【发布时间】:2020-12-11 11:00:50 【问题描述】:

假设您在计算机上玩游戏,使用箭头键或 WASD 移动角色,假设您按住 向上箭头 键/W向左箭头 键/A 一起,如果游戏允许,你的角色会在两者之间移动 >,即使您按住两个中的一个然后另一个之后,同时继续按住第一个,2个中的一个都不会被打断然后忽略

我知道如何检测用户是否按下了箭头键/字母,

#include <iostream>
#include <conio.h>
using namespace std;

int main() 
    while (1) 
        int ch = getch();
        if (ch == 224) 
            ch = getch();
            switch (ch) 
            case 72: cout << "up\n";    break;
            case 80: cout << "down\n";  break;
            case 77: cout << "right\n"; break;
            case 75: cout << "left\n";  break;
            default: cout << "unknown\n";
            
        
        else 
            cout << char(ch) << '\n';
    

但我找不到方法来做我在这个问题开头提到的事情


感谢任何尝试提供帮助

【问题讨论】:

添加了windows 标签,因为conio.h 是一个MS-DOS 库。如果它不正确,请随时恢复它。 如果确实是windows,那么***.com/questions/2067893/c-console-keyboard-events或者问题实际上是关于DOS的? @Yksisarvinen,我实际上是在 Visual Studio 2019 中的 Windows 中编写代码,但我不是在编写 Windows 程序,我不使用 WinAPI,我认为是跨平台的,而不是 getch() 我使用_getch() bcs 否则我会出错 跨平台 C++ 只有基于行的字符 I/O(conio.h 不是标准头文件)。即使无需每次都按 Enter 键来获取单个字符,也取决于平台。更不用说允许您识别同时按键的按键事件了。所以...我猜是选一个平台? 【参考方案1】:

即使conio.h 函数级别相当低,它们也不足以满足您的要求:您不想从控制台缓冲区中提取字符(getch 所做的)但知道状态(按下/释放) 的一些键。

所以你应该直接使用WINAPI函数GetKeyState。你的程序将不再兼容 MS/DOS,但我认为这在 2020 年不是一个真正的问题......

【讨论】:

以上是关于如何检测 C++ 中的组合键输入?的主要内容,如果未能解决你的问题,请参考以下文章

如何检测单个控制键盘事件而不是键组合?

如何在java中单击按钮时检测修饰键组合

Qt和PyQt中的组合键输入捕获处理

在Delphi中 如何在字符串中表示 CTRL+ENTER 组合键?

小功能⭐️Untiy组合键检测

win10 怎么查电脑配置