如何在Dart控制台应用程序中监听键盘事件?

3
我找到的关于web和dart:html包的所有示例。在桌面控制台程序中,我可以从系统获取键盘或鼠标事件吗?
1个回答

8

我认为你不能读取鼠标事件,但你可以从 stdin 中读取按键代码。要实现这一点,只需将其设置为“原始”模式,将 lineModeechoMode 都设置为 false,然后监听此流。

下面是一个简单的示例:

import 'dart:async';
import 'dart:convert';
import 'dart:io' as io;

Future main() async {
  io.stdin
    ..lineMode = false
    ..echoMode = false;
  StreamSubscription subscription;
  subscription = io.stdin.listen((List<int> codes) {
    var first = codes.first;
    var len = codes.length;
    var key;
    if (len == 1 && ((first > 0x01 && first < 0x20) || first == 0x7f)) {
      // Control code. For example:
      // 0x09 - Tab
      // 0x10 - Enter
      // 0x1b - ESC
      if (first == 0x09) {
        subscription.cancel();
      }
      key = codes.toString();
    } else if (len > 1 && first == 0x1b) {
      // ESC sequence.  For example:
      // [ 0x1b, 0x5b, 0x41 ] - Up Arrow
      // [ 0x1b, 0x5b, 0x42 ] - Down Arrow
      // [ 0x1b, 0x5b, 0x43 ] - Right Arrow
      // [ 0x1b, 0x5b, 0x44 ] - Left Arrow
      key = '${codes.toString()} ESC ${String.fromCharCodes(codes.skip(1))}';
    } else {
      key = utf8.decode(codes);
    }
    print(key);
  });
  print('Start listening');
}

您还可以利用dart_console包或适应它们的readKey()方法来解析控制和esc码。


谢谢。这是非常有用的建议和方向。不幸的是,InelliJ运行控制台返回异常StdinException:设置终端行模式错误,操作系统错误:设备不支持的ioctl,errno = 25。这对于调试来说不方便,但这并不是个问题。 - undefined
@Makdir 是的,这就是我无法解决的问题。在IntelliJ中,应该使用-Drun.processes.with.pty=true虚拟机选项来解决,但实际上并没有起作用。所以,只有从真实的终端运行才有效。 - undefined
有没有办法获取“键盘抬起”事件? - undefined
我为无法从IDE中运行此bug提出了申请:https://issuetracker.google.com/issues/219274483 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接