【问题标题】:Platform-independent detection of arrow key press in C++C++ 中与平台无关的方向键检测
【发布时间】:2021-12-16 06:31:34
【问题描述】:

在 C++ 控制台程序中,我发现了如何在 Windows 上检测和箭头键,并且我发现了许多与问题无关的其他内容(尽管我认为这些搜索词很好) ,但我想知道是否有一种独立于平台的方法来检测箭头键按下。一个不错的第二个地方是如何检测 unix 和 mac 中的箭头键按下。代码片段将不胜感激。

【问题讨论】:

    标签: c++ user-input


    【解决方案1】:

    没有跨平台的方法可以做到这一点,因为它不是由 C 或 C++ 标准定义的(尽管可能有一些库在不同平台上编译时抽象出差异)。

    我相信您在 POSIX 机器上寻找的库是 curses,但我自己从未使用过它——我可能是错的。

    请记住,控制台程序(即 gnome-terminalkonsolexterm)完全有可能将这些键用于其他功能。

    【讨论】:

      【解决方案2】:

      正如比利所说,没有标准的跨平台方法。

      我个人将这个(面向游戏的)库用于所有输入,跨平台 win/linux/mac :http://sourceforge.net/projects/wgois/

      【讨论】:

      【解决方案3】:

      您可以使用SDL2 进行跨平台操作。

      示例代码:

          #include <SDL2/SDL.h>
      
          int main()
          {
              SDL_Event event;
      
              SDL_PollEvent(&event);
      
              if(event.type == SDL_KEYDOWN)
              {
                  // Move centerpoint of rotation for one of the trees:
                  switch(event.key.keysym.sym)
                  {
                      case SDLK_UP:
                          // do something
                          break;
                      case SDLK_DOWN:
                          // do something
                          break;
                      case SDLK_LEFT:
                          // do something
                          break;
                      case SDLK_RIGHT:
                          // do something
                          break;
                      case SDLK_ESCAPE:
                          // do something
                          return 0;
                      default:
                          break;
                  }
              }
      
              return 0;
          }
      

      【讨论】:

      • 我在 ubuntu 18.04 上运行它,但它不能编译...undefined reference to `SDL_PollEvent' collect2: error: ld returned 1 exit status我做错了什么??我实际上只是复制了这段代码并下载了库......
      • @AbrahamMurcianoBenzadon 如果它是一个未定义的引用,您没有正确链接到库 - 查看 SDL 文档、SDL 教程以及您必须链接到的内容以及在您的操作系统/编译器上的链接顺序.
      • 只有聚焦 sdl 窗口才会起作用
      • @answer42 这当然是预期的行为。当 SDL 应用程序不是焦点窗口时,您不希望 SDL 应用程序窃取按键。除非你的意思是别的
      猜你喜欢
      • 2010-10-07
      • 2010-12-02
      • 2023-03-04
      • 2023-01-17
      • 2011-01-08
      • 2012-04-02
      • 1970-01-01
      相关资源
      最近更新 更多