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
相关产品推荐
相关产品推荐

