【问题标题】:Get events (e.g. Key up) from keyboard从键盘获取事件(例如按键)
【发布时间】:2014-04-19 10:16:39
【问题描述】:

好的,基本上我正在构建一个简单的交互式控制台。

用户可以输入命令<command>+RETURN 并对其进行处理。

    while (true)
    {
        write(LGM_PROMPT);

        auto input = strip(stdin.readln());

        if (input=="exit") break; 
        else 
        {
            // Process command

        }

    }

但是,我还希望能够获取和处理其他事件,例如“向上箭头”、“向左箭头”等。

你会怎么做?这可以用纯 D 代码完成,还是必须使用 C 函数?

【问题讨论】:

    标签: c keyboard-events d dmd


    【解决方案1】:

    这取决于平台。

    在 Windows 上,您需要使用 ReadConsoleInput。

    在其他系统上,终端将为非文本输入生成escape codes。您需要使用 getch 逐个字符地阅读它们,然后适当地解析它们。

    对于 D,有一个 ConsoleD 项目,它抽象出一些特定于平台的控制台功能,尽管我不确定它是否也处理输入。

    【讨论】:

    • ConsoleD 项目很很有趣。不过,我相信您发送的大部分内容都是特定于 Windows 的。
    • 嗯,大多数情况下,您可以将其归为 Windows 和 Posix 的 2 组,尽管 Posix 组中的某些内容也可能有所不同。
    【解决方案2】:

    这是一个特定于平台的任务,需要大量代码,尤其是 linux 上的箭头键,因为输入代码各不相同!

    我的 terminal.d 在大多数情况下都会这样做https://github.com/adamdruppe/misc-stuff-including-D-programming-language-web-stuff/blob/master/terminal.d

    这是一个演示用法: http://arsdnet.net/rtinput.d

    该库有一个单独的按键按下和按键释放事件,但按键释放仅在 Windows 上准确报告(Linux 终端不会告诉您何时释放按键),所以不要依赖它,除非您是确定你正在做一个 Windows 应用程序。但它仍然存在,所以你仍然需要过滤掉它......

    编辑:虽然我的东西没有获取线功能,但它逐个字符地提供事件。但无论如何,如果你想处理箭头,你就必须这样做。对于自动处理行编辑的库,如果您可以使用 GPL,请查看 GNU Getline,它也很容易从 D 中使用。

    【讨论】:

    • 好的,哇。比较感人!我会调查一下! (顺便说一句,我正在 OSX(可能是 *nix)上测试这个 - 但不是 Windows)
    • 我从来没有真正在 Mac 上尝试过我的代码,但它应该可以工作,我认为那里的终端与 linux 的 xterm 工作方式相同。
    • 好吧,我认为你是 100% 正确的。从来没有注意到这两个终端之间有任何区别(我多年来一直是这两个终端的用户)......
    【解决方案3】:

    如果您需要可移植性,ncurses 是您的最佳选择。现在 Ncurses 可以在 Windows 上轻松编译,并且在 Deimos 中已经绑定了它...

    【讨论】:

      猜你喜欢
      • 2021-01-20
      • 2012-07-01
      • 1970-01-01
      • 2013-03-12
      • 1970-01-01
      • 1970-01-01
      • 2015-03-18
      • 1970-01-01
      • 2018-04-15
      相关资源
      最近更新 更多