2014-04-26 4 views
3

키보드의 키를 눌렀다가 놓는 사용자에게 기능을 바인딩 할 수 있는지 알고 싶습니다. nodejs keydown/keyup events

지금까지, 나는 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로 실행되는 것을 찾고 있습니다.

감사합니다.

답변

3

그래서이 문제를 해결하려면 stdin의 제한 사항을 생각했습니다.

기본적으로 입력을 위해 키보드에서 수신 대기하는 백그라운드에서 프로그램을 실행하기 위해 SDL 라이브러리 (함께 node bindings)를 사용합니다.

이 작업을 수행하려면

  • 는 노드 버전 ~ 0.10을 실행해야합니다. (분명히 노드 작업의 방법 C 바인딩은? 0.11에서 조금 다르게)는
  • (맥에) 사제를 통해의 라인을 따라
  • npm install --save https://github.com/creationix/node-sdl/tarball/master

그리고 뭔가를 sdl, sdl_ttfsdl_image 설치 :

var sdl = require('sdl'); 

sdl.init(sdl.INIT.VIDEO); 

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

SDL_PollEvent는 SDL은 (a MAC)에 상기 스크립트의 D에 별도의 애플리케이션을 시작 SDL_INIT_VIDEO으로 초기화 될 필요 아무 것도 그리지 않지만 입력을 받아들이는 데 집중해야합니다.

ANSI 단말기가 단순히 키 업 이벤트를 지원하지 않는다는 사실은 사실이지만,이 해결 방법은 일부 GUI 기반 시스템의 작동을 요구합니다 (즉, ssh에서 작동하지 않을 수도 있음).

0

keypress, keydown/keyup 만 있습니다.

2

리눅스 데스크톱에서는 'xev'명령의 출력을 모듈로 파이프 한 다음 스트림을 구문 분석하여 자신의 '키 업'및 '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