【问题标题】:How to detect combined key input in C++?如何检测 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,那么stackoverflow.com/questions/2067893/c-console-keyboard-events或者问题实际上是关于DOS的?
  • @Yksisarvinen,我实际上是在 Visual Studio 2019 中的 Windows 中编写代码,但我不是在编写 Windows 程序,我不使用 WinAPI,我认为是跨平台的,而不是 getch() 我使用_getch() bcs 否则我会出错
  • 跨平台 C++ 只有基于行的字符 I/O(conio.h 不是标准头文件)。即使无需每次都按 Enter 键来获取单个字符,也取决于平台。更不用说允许您识别同时按键的按键事件了。所以...我猜是选一个平台?

标签: c++ windows input arrow-keys


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-10
    • 1970-01-01
    • 2015-02-16
    • 1970-01-01
    相关资源
    最近更新 更多