nodejs keydown / keyup事件

时间:2014-04-26 23:15:16

标签: javascript node.js

我很想知道是否可以将功能绑定到用户按下/释放键盘上的键。

到目前为止,我已经能够使用keypress模块和process.stdin的原始模式获取关键新闻事件:

var keypress = require('keypress');
keypress(process.stdin);
process.stdin.on('keypress', function(ch, key) {
    console.log('got "keypress"', key);
    if (key && key.ctrl && key.name == 'c') {
        process.exit();
    }
});
process.stdin.setRawMode(true);
process.stdin.resume();

是否正在捕捉键盘按在终端中发布事件?

值得注意的是,我对任何浏览器实现都不感兴趣;我正在寻找终端中NodeJS中运行的东西。

谢谢,所有。

4 个答案:

答案 0 :(得分:3)

所以我想出了一个解决方法stdin的限制,以使其发挥作用。

基本上我使用SDL库(及其node bindings)在后台运行一个程序,该程序在键盘上进行监听以进行输入。

要做到这一点:

  • 确保您运行的是Node版本~0.10。 (显然,节点上的C绑定在0.11中的工作方式有点不同?)
  • 通过自制软件安装sdlsdl_ttfsdl_image(在Mac上)
  • npm install --save https://github.com/creationix/node-sdl/tarball/master

然后是:

var sdl = require('sdl');

sdl.init(sdl.INIT.VIDEO);

while (true) {
    var e;
    while (e = sdl.pollEvent()) {
        console.log(e);
    }
}

SDL_PollEvent要求使用SDL_INIT_VIDEO初始化SDL,在上面的脚本中(在mac上)在Dock中启动一个单独的应用程序,什么都不做,但需要集中精力接受输入。 / p>

虽然技术上确实ANSI终端根本不支持keyup事件,但这种解决方法完全允许在Node中捕获keyup事件(尽管需要一些基于GUI的系统才能运行,即很可能无法在ssh上运行)。

答案 1 :(得分:2)

在Linux桌面上,您可以将'xev'命令的输出传输到您的模块中,然后解析该流以发出您自己的'keyup'和'keydown'事件。可能比SDL更不便携,但更直接。有一个module来做这件事。 (免责声明:我写过)。

const xevEmitter = require('xev-emitter')(process.stdin)
xevEmitter.on('KeyPress', (key) => {
    console.log(key, 'was pressed')
})

xevEmitter.on('KeyRelease', (key) => {
    console.log(key, 'was released')
})

执行:

$ xev | node example.js
h was pressed
h was released

答案 2 :(得分:1)

这是一个很好的工具: https://www.npmjs.com/package/iohook

查看示例代码:

public TopicDto saveTopic(TopicDto dto){
    return topicMapper.toDto(repository.save(topicMapper(toEntity(dto)));

软件包ioHook doc的用法链接 https://wilix-team.github.io/iohook/usage.html

答案 3 :(得分:0)

只有按键,没有keydown / keyup。