c++ - 获取当前按键的简单方法
问题描述
我已经开始使用 SFML 作为我正在处理的代码编辑器的基本图形框架,唯一我似乎无法完全正确的是键盘输入。
我在 QB64(一种类似于 Visual Basic 的语言)中习惯使用 _keyhit 命令(返回虚拟键码)或 inkey$ 命令(直接返回当前按键的字符)来获取按键。我正在寻找 C++ 中的类似解决方案(不一定是跨平台的,可能与 SFML 一起很容易实现)
到目前为止,我尝试使用 _getch,它似乎不适用于 Windows 框架,也不适用于 SFML,也许我应该为此目的使用一些 Windows.h 例程,但从我的情况来看看到,那些检查特定的按键,不完全是我需要的。SFML 框架提供“sf::Keyboard::isKeyPressed”,但它也检查特定的按键,但不检查整个键盘,我还尝试创建一个数组,用作“sf::Keyboard: :Key" 枚举到 ASCII 字符,但它并不令人信服,此外,键似乎“粘住”,即使在释放后,按下的键的字符也会继续被读取。
解决方案
如果您使用的是 SFML,它实际上非常简单。您需要使用 sf::Event::KeyEvent 类(或在本例中为结构)。
https://www.sfml-dev.org/documentation/2.5.0/structsf_1_1Event_1_1KeyEvent.php
虽然问题是你必须从某事中获得事件。通常这是从 SFML 窗口中使用的。
//assuming your code is already set up for these items...
sf::Event Event;
while (window.GetEvent(Event))
{
if (Event.Type == sf::Event::KeyPressed)
{
//to get the key code, use Event.Key.Code
//your code
//for example
switch(Event.KeyEvent.Code)
{
case(sf::Keyboard::Key::Y):
//do stuff
break;
}
}
}
注意,我使用 SFML 已经有一段时间了,所以我不能 100% 确定它是否适用于 switch 语句。在声明中,比较==
也可以。if-else if-else
可能还有其他方法可以在sf::Event
没有窗口的情况下获得定义。否则,它相当简单。
推荐阅读
- c++ - 如何在 Windows 中使用 sys 标头(或找到它们的 MSVC 对应标头)?
- android - android:背景不适用于主题为 Theme.MaterialComponents.DayNight.DarkActionBar 的按钮
- scala - 在 spark scala 中获取 s3 目录的大小
- r - 如何在 NMDS 排序中绘制超过 2 个维度?
- dynamic - PowerBI中基于Dynamic Measure的Dynamic Bin
- linux - Linux 中的任何操作系统触发器以由用户手动检测系统时间/时区更改
- dockerfile - 如果 xx 或 xx,否则... dockerfile 中的条件
- reactjs - 当使用 Jest & Enzyme 加载 = false 时,如何模拟 Graphql 查询并将加载程序设置为 false 以测试反应组件?
- npm - npm 安装:npm 错误!https://registry.npmjs.org/axios 上的无效 json 响应正文 原因:JSON 输入意外结束
- elasticsearch - 有没有办法在弹性搜索中按字段 A 对前 N 个项目进行排序,然后按字段 B 排序