首页 > 解决方案 > 获取当前按键的简单方法

问题描述

我已经开始使用 SFML 作为我正在处理的代码编辑器的基本图形框架,唯一我似乎无法完全正确的是键盘输入。

我在 QB64(一种类似于 Visual Basic 的语言)中习惯使用 _keyhit 命令(返回虚拟键码)或 inkey$ 命令(直接返回当前按键的字符)来获取按键。我正在寻找 C++ 中的类似解决方案(不一定是跨平台的,可能与 SFML 一起很容易实现)

到目前为止,我尝试使用 _getch,它似乎不适用于 Windows 框架,也不适用于 SFML,也许我应该为此目的使用一些 Windows.h 例程,但从我的情况来看看到,那些检查特定的按键,不完全是我需要的。SFML 框架提供“sf::Keyboard::isKeyPressed”,但它也检查特定的按键,但不检查整个键盘,我还尝试创建一个数组,用作“sf::Keyboard: :Key" 枚举到 ASCII 字符,但它并不令人信服,此外,键似乎“粘住”,即使在释放后,按下的键的字符也会继续被读取。

标签: c++windows

解决方案


如果您使用的是 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没有窗口的情况下获得定义。否则,它相当简单。


推荐阅读