【问题标题】:Simple way to get the current keypress获取当前按键的简单方法
【发布时间】:2018-07-05 02:21:31
【问题描述】:

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

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

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

【问题讨论】:

  • 自 90 年代初以来,还没有一种“简单的方法”可以在计算机上执行任何操作。

标签: c++ windows


【解决方案1】:

如果您使用的是 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。 否则,它相当简单。

【讨论】:

  • 这是假设您将 SFML 作为图形运行,因此此选项最适合您。
  • 谢谢,这行得通,但是类成员似乎被称为“key”而不是“KeyEvent”,而“GetEvent”被称为“pollEvent”。无论如何,如果 SFML 使用 ASCII 常量而不是它自己的专有常量,那就太好了。
  • 嘿!我找到了一个更好的解决方案,使用 sf::Event::TextEntered 和 event.text en.sfml-dev.org/forums/index.php?topic=2269.0
【解决方案2】:

如果您只是想检测按键 kbhit() 是功能。(Borland 系列编译器,conio.h,但不是 C++ 标准的一部分,当我用谷歌搜索它时)。 https://www.cprogramming.com/fod/kbhit.html

替代方案:在类 Unix 操作系统下,您可以使用 ncurses 来模拟大多数 conio 行为(看看它是否适合您) https://www.quora.com/With-which-function-can-I-replace-kbhit-in-C++-because-the-header-conio-h-doesnt-exist-in-linux

如果您正在寻找可以检测按下哪个键的代码(即字母上方的数字小键盘 1 和 1 或类似 Esc 或箭头键的东西)。此代码在 borland 编译器上为我工作。 当您获取扫描码(不是 ascii)时,键盘上的每个键都不同(即使是非 ascii 键也有值)

void getkey()
{
union REGS ii,oo;
while(!kbhit());
ii.h.ah=0;//service no for ascii and scan code
int86(22,&ii,&oo);
ascii=oo.h.al;
scan=oo.h.ah;
}

我在我的学校项目中使用了上面的代码,所以我不记得我在哪里找到它的确切来源。但我认为它是 Yashwant Kanetkar 在 GUI 部分下的 Let us C(它后来被删除了,所以你是寻找 2008 年之前的出版物)。

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 2020-01-18
    • 2016-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 2011-01-03
    • 2011-09-13
    相关资源
    最近更新 更多