You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js如何获取按键列表及识别shift+alt+up、ctrl+h等特殊组合键

解决方案

原生readline模块的keypress事件内置解析逻辑存在两个固有局限:一是会优先将匹配到的控制字符序列映射为功能键,导致ctrl+h这类和控制字符重叠的组合键被覆盖;二是没有完整解析ANSI转义序列中的修饰键位,无法识别多修饰键搭配方向键/功能键的组合。你可以基于原生返回的sequence字段做二次解析,完全自主控制按键识别逻辑,实现代码如下:

const readline = require('readline');

readline.emitKeypressEvents(process.stdin);
process.stdin.setRawMode(true);

// 转义序列修饰位和实际修饰键的映射表
const modifierMap = {
  1: [],
  2: ['shift'],
  3: ['alt'],
  4: ['shift', 'alt'],
  5: ['ctrl'],
  6: ['ctrl', 'shift'],
  7: ['ctrl', 'alt'],
  8: ['ctrl', 'shift', 'alt']
};

// 功能键/方向键序列后缀和按键名的映射表,可按需扩展
const keyNameMap = {
  'A': 'up',
  'B': 'down',
  'C': 'right',
  'D': 'left',
  'H': 'home',
  'F': 'end',
  'P': 'f1',
  'Q': 'f2',
  'R': 'f3',
  'S': 'f4'
};

process.stdin.on('keypress', (str, key) => {
  const parsedKey = { ...key };

  // 修正ctrl+h被识别为backspace的问题
  if (key.sequence === '\x08') {
    parsedKey.name = 'h';
    parsedKey.ctrl = true;
    parsedKey.meta = false;
    parsedKey.shift = false;
  }

  // 解析带修饰键的功能键/方向键转义序列
  const escapeReg = /^\x1b\[(\d*);(\d)([A-Za-z])$/;
  const matchResult = key.sequence.match(escapeReg);
  if (matchResult) {
    const modifierCode = parseInt(matchResult[2]);
    const keySuffix = matchResult[3];
    const modifiers = modifierMap[modifierCode] || [];
    parsedKey.name = keyNameMap[keySuffix] || parsedKey.name;
    parsedKey.ctrl = modifiers.includes('ctrl');
    parsedKey.meta = modifiers.includes('alt');
    parsedKey.shift = modifiers.includes('shift');
  }

  // 输出解析完成的按键信息
  console.log(parsedKey);

  // 保留ctrl+c退出逻辑
  if (parsedKey.ctrl && parsedKey.name === 'c') process.exit();
});

以上代码可直接识别shift+alt+up这类多修饰键组合,也能正确区分ctrl+h和退格键。如果需要支持更多特殊按键,只需补充keyNameMap的映射规则即可,所有按键输入的原始信息都会完整保留在sequence字段中,你可以完全按照自己的需求自定义解析逻辑。

内容的提问来源于stack exchange,提问作者Peter Kapteyn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 10:48:00