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:
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é.