【问题标题】:Cannot distinguish between up/down arrow in stdin raw mode无法区分标准输入原始模式下的向上/向下箭头
【发布时间】:2018-09-16 05:21:05
【问题描述】:

我有这段代码:

  process.stdin.setRawMode(true).resume();

  process.stdin.on('data', (buf) => {

    const str = String(buf);
    const charAsAscii = String(buf.toString().charCodeAt(0));

    switch (charAsAscii) {

      case '25': // left arrow ?
        console.log('left arrow');
        return;

      case '26': // right arrow ?
        console.log('right arrow');
        return;

      case '27': // down arrow
        console.log('down arrow');
        return;

      case '28': // up arrow?
        console.log('up arrow');
        return;

      default:
        console.error('default')
    }

}

所有箭头键似乎都被识别为向上箭头,也就是说,所有 4 个箭头键始终匹配大小写“28” ...我正在寻找区分向上/向下/向左/右箭头键,有人知道怎么做吗?

【问题讨论】:

  • 如果您在进入开关之前打印出“charAsAscii”变量,它是否会产生预期值? (我根本不是节点人,如果要求的澄清很愚蠢,很抱歉)
  • 让我检查一下,不是一个愚蠢的问题
  • 是的,正如我在 OP 中描述的那样,无论我按下 4 个箭头键中的哪一个,它总是代码“27”,顺便说一句,我现在在 MacOS 上
  • 从标准输入获得的缓冲区包含键入的字符,但箭头键不是字符。它们和其他类似的东西被编码为转义序列。例如,序列 1B 5B 41 是“向上”箭头。使用.charCodeAt(0) 得到的只是引入该转义序列的 ASCII 转义字符 (0x1B = 27)。
  • 我链接了一个骗子?

标签: node.js stdin


【解决方案1】:

对于箭头键,缓冲区有点不同:有 3 个字节。 我不知道它们代表什么,但我只知道你必须得到第三个字符:

process.stdin.setRawMode(true)
process.stdin.on('data', (data) => {
    const str = data.toString();
    if (str.length == 3) {
        console.log(str.charCodeAt(2))
    }
})

箭头代码:

向上 -> 65
向下 -> 66
右 -> 67
左 -> 68

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-03
    • 2019-02-19
    • 2010-09-21
    • 1970-01-01
    • 1970-01-01
    • 2019-04-03
    相关资源
    最近更新 更多