Nodejs监听全局热键按下

23

我不是将Node用作服务器;我将其用于CLI应用程序。然而,这个应用程序需要在后台运行并监听全局按键事件(即使没有焦点)。

我没有看到在Node中明显的方法来实现这一点。那么我的选择是什么?


考虑到您将其用于命令行工具目的,"在后台"是什么意思?在什么背景下? - Mike 'Pomax' Kamermans
我的大多数应用程序都是CLI应用程序。但这个不是。它将成为一个后台进程。但是当你按下它的热键时,它会弹出一个CLI界面。 - Farzher
好的,那背景是什么?你将其作为后台进程运行,但你的全局环境是什么?Windows、OSX、Linux GUI、终端访问、虚拟机...? - Mike 'Pomax' Kamermans
4
为什么这很重要?它应该是跨平台的。如果可能的话,应该支持Windows、Linux以及Mac。 - Farzher
3
这是一个奇怪的问题。为什么不重要呢?不同的环境有不同的API用于与操作系统通信,有人为特定的操作系统编写热键库的可能性要比有人为所有操作系统编写库的可能性高得多。如果你已经在http://npmjs.org上搜索过了,但没有看到你所需要的东西,更新一下你的帖子并说明你已经搜索了哪些地方会有所帮助。 - Mike 'Pomax' Kamermans
@StephenSarcsamKamenar - 我没有验证这个答案,但它看起来可能是你正在寻找的:http://stackoverflow.com/a/26734577/3212415 - Troy Gizzi
6个回答

16

看起来你需要捕获所有键盘事件的全局钩子。
你可以尝试使用 iohook 模块。使用方法非常简单:

const ioHook = require('iohook');
ioHook.on("keypress", event => {
  console.log(event);
  // {keychar: 'f', keycode: 19, rawcode: 15, type: 'keypress'}
});
ioHook.start();

4
似乎iohook不能安装在较新版本的Node上。我使用的是Node v8.1.4,但它无法安装,而且当“npm install”安装失败后没有任何输出,因此我也无法编译。请您帮忙看看。 - Steverino
是的,抱歉。我只是没有时间更新iohook。 - Joviallix
1
@Steverino,我已经更新了iohook以支持新版本的node.js。 - Joviallix
1
我正在使用v6.11.1版本,只能获取一个按键事件。 - Matko
这是有缺陷的。请使用 https://www.npmjs.com/package/keypress 来代替。 - Emmanuel Mahuni
显示剩余2条评论

3

我只是用iohook来完成这个任务。你可以像这样做...

const ioHook = require('./node_modules/iohook-master/index.js');

ioHook.on("keyup",function(keyPress){
    if(keyPress.keycode == CTRLIZQ){
        //do something
    }
});

ioHook.start();

2
似乎结合守护进程键盘敲击可以实现你想要的功能。我只在node脚本中使用过keypress,没有使用过守护进程,所以我不知道它是否能够以相同的方式工作。但是可能会!最坏的情况是,你发现了一种无法解决你问题的解决方案。

无法相信这个程序8年后仍然能够正常工作。 - Emmanuel Mahuni

0

我之前在评论中说要使用keypress,但是看到这个库已经8年没有更新了,而且被放弃了,有人写了一个替代该库的东西,它完全做同样的事情,而且它是nodejs内部依赖。

let readline = require('readline');

readline.emitKeypressEvents(process.stdin);

process.stdin.on('keypress', (ch, key) => {
  console.log('got "keypress"', ch, key);
  if (key && key.ctrl && key.name == 'c') {
    console.log('ctrl+c was pressed');
    // do something usefull
  }
});

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

1
这并不监听全局按键,只有当前进程在焦点时才会监听。 - Jason Adhinarta

0

0

gkm 在 Linux 上运行

https://www.npmjs.com/package/gkm

const gkm = require('gkm');

gkm.events.on('key.*', data => {
    const button = data[0];

    if (button === 'Escape') {
        console.log('Escaped');
        process.exit();
    }
});

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