web-dev-qa-db-fra.com

Comment intercepter toutes les frappes

Tout d'abord, je ne m'attends pas à ce qu'une telle chose existe déjà, mais j'aimerais savoir comment une telle chose serait accomplie.

Je veux un programme en marche en arrière-plan qui interceptera TOUTES les frappes saisies (je suppose que X est en cours d'exécution et peut-être même qu'Unity est également en cours d'exécution), traite ces frappes au clavier, puis envoie les frappes d'origine ou modifiées à traité comme d'habitude.

Mon objectif ultime est de créer une sorte de mappage de touches qui imite plus fidèlement le comportement des raccourcis OS X. C'est très difficile avec une installation standard d'Ubuntu, car des éléments comme ctrl + c semblent être gravés dans la pierre, alors que pour imiter le comportement d'OS X, il faudrait que ce soit cmd + c. Quoi qu'il en soit, je suis moins intéressé par le pourquoi et plus intéressé par le comment. Je ne suis pas opposé à l'écriture d'un démon en Python, C ou autre chose qui pourrait être nécessaire (je suis aussi assez à l'aise avec les applications UNIX standard). Cependant, je ne sais absolument pas par où commencer.

Lorsque les frappes au clavier sont interceptées et traitées, il devrait être en mesure de les renvoyer au système d'exploitation en suivant la même interface que celle à laquelle les traits avaient été envoyés. Peut-être que cela devrait être un patch pour X lui-même? Ou est-ce que quelque chose pourrait être en place entre le clavier et X?

6
gregghz

Pour afficher les événements des claviers, mais aussi d'autres périphériques d'entrée, il existe également evtest.
Il ne peut pas créer de touches de clavier en soi, mais voir ci-dessous.

Il montre les événements à un niveau inférieur à celui de xev, par exemple.

En outre, il indique quels événements peuvent être créés par le périphérique.

Il se trouve que event4 fait référence à mon clavier principal.

Je crée donc l'exemple de sortie ci-dessous avec la commande

Sudo evtest /dev/input/event4

et en appuyant aB:

[ ... ]
Event: time 1429316964.681508, type 4 (EV_MSC), code 4 (MSC_SCAN), value 70004
Event: time 1429316964.681508, type 1 (EV_KEY), code 30 (KEY_A), value 1
Event: time 1429316964.681508, -------------- SYN_REPORT ------------
aEvent: time 1429316964.761540, type 4 (EV_MSC), code 4 (MSC_SCAN), value 70004
Event: time 1429316964.761540, type 1 (EV_KEY), code 30 (KEY_A), value 0
Event: time 1429316964.761540, -------------- SYN_REPORT ------------
Event: time 1429316965.385461, type 4 (EV_MSC), code 4 (MSC_SCAN), value 700e1
Event: time 1429316965.385461, type 1 (EV_KEY), code 42 (KEY_LEFTSHIFT), value 1
Event: time 1429316965.385461, -------------- SYN_REPORT ------------
Event: time 1429316965.577461, type 4 (EV_MSC), code 4 (MSC_SCAN), value 70005
Event: time 1429316965.577461, type 1 (EV_KEY), code 48 (KEY_B), value 1
Event: time 1429316965.577461, -------------- SYN_REPORT ------------
BEvent: time 1429316965.641460, type 4 (EV_MSC), code 4 (MSC_SCAN), value 70005
Event: time 1429316965.641460, type 1 (EV_KEY), code 48 (KEY_B), value 0
Event: time 1429316965.641460, -------------- SYN_REPORT ------------
Event: time 1429316965.713470, type 4 (EV_MSC), code 4 (MSC_SCAN), value 700e1
Event: time 1429316965.713470, type 1 (EV_KEY), code 42 (KEY_LEFTSHIFT), value 0
[ ... ]


(Pour trouver le bon numéro d’événement (comme mon événement 4), vous pouvez consulter cat /proc/bus/input/devices. Le Name ne fait peut-être pas référence à un clavier, mais recherchez l’entrée Handlers contenant sysrqkbd et leds, ou essayez-les tous simplement.)



Les événements de pression de touche ne peuvent pas être créés par evdev, mais il existe une implémentation d'un remappage de clé utilisant evdev pouvant créer de nouveaux événements.
Il semble correspondre à ce que vous recherchez:

Modificateur At Home de Evdev (ahm ou at-home-modifier-evdev):

Il permet par exemple "Touche double rôle Espace/Décalage". Lorsque vous appuyez uniquement sur la touche Espace, vous obtenez un espace. mais quand vous appuyez dessus avec une autre touche, c'est un changement. Par exemple, espace + x = X, grossièrement.

Toutes les paires de clés sont possibles. Par exemple, vous pouvez transformer votre Alt gauche en BS/Alt en plus de Space/Shift. Dans cet exemple, Space suivi de LAlt envoie Shift + BS, LAlt suivi de Space à Alt + Space, et Space + LAlt + x et LAlt + Espace + x à Alt + Shift + x.

C'est un fork du driver "evdev" de Xorg [...]

Cela ne prétend pas être une implémentation propre - mais cela n'empêche pas d'en tirer des leçons.

3
Volker Siegel

Oui, il existe un enregistreur de frappe pour Ubuntu ..

Vous pouvez le télécharger à partir d'ici

Ou vous l'installez via apt-get

Activer les référentiels d'univers, puis exécuter ce qui suit dans le terminal

Sudo aptitude update
Sudo aptitude install lkl

Pour exécuter, tapez ce qui suit dans le terminal

lkl -l -k us_km -o log.file

pour voir les résultats

tail log.file

2
Ringtail