Événements de keydown / keyup nodejs

Je suis intéressé de voir s'il est possible de lier des fonctions à un utilisateur en appuyant / relâchant une touche sur le clavier.

Jusqu'à présent, j'ai pu obtenir des événements de touche avec le module de pression de touche et le mode brut de 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(); 

Est-ce que la capture de clavier presse et libère des événements même possible dans un terminal?

Il convient de noter que je ne suis pas intéressé par les implémentations de navigateur; Je recherche quelque chose qui fonctionne dans NodeJS dans un terminal.

Merci a tous.

J'ai donc trouvé une solution de contournement aux limites de stdin pour que cela fonctionne.

Fondamentalement, j'utilise la bibliothèque SDL (avec ses liaisons de noeud ) pour exécuter un programme en arrière-plan qui écoute le clavier pour l'entrée.

Pour faire ça:

  • Assurez-vous que vous exécutez Node version ~ 0.10. (Apparemment, la façon dont les liaisons C sur le nœud fonctionnent un peu différemment en 0.11?)
  • Installez sdl , sdl_ttf et sdl_image via homebrew (sur un mac)
  • npm install --save https://github.com/creationix/node-sdl/tarball/master

Et puis quelque chose dans le sens de:

 var sdl = require('sdl'); sdl.init(sdl.INIT.VIDEO); while (true) { var e; while (e = sdl.pollEvent()) { console.log(e); } } 

SDL_PollEvent nécessite que SDL soit initialisé avec SDL_INIT_VIDEO , qui dans le script ci-dessus (sur un mac) démarre une application distincte dans le dock qui ne tire rien, mais doit être concentré pour accepter l'entrée.

Bien qu'il soit techniquement vrai que les terminaux ANSI ne prennent tout simplement pas en charge les événements de la souris, cette solution permet de saisir tous les événements de la souris dans le noeud (bien que nécessitant un système basé sur l'interface graphique), c'est-à-dire que le plus probable ne fonctionnera pas sur ssh).

Sur un bureau Linux, vous pouvez transférer la sortie de la commande 'xev' dans votre module, puis analyser le flux pour émettre vos propres événements 'keyup' et 'keydown'. Moins portable que SDL peut-être, mais plus simple. Il y a un module pour le faire. (Avertissement: je l'ai écrit).

 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') }) 

Exécution:

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

Il n'y a que la pression de touche, pas de clavier / clé.