Ce n'est peut-être pas très demandé, mais il y a de rares moments où vous souhaitez obtenir des frappes au clavier tout en s'exécutant en arrière-plan (c'est-à-dire que l'application Python est floue). Java a une bibliothèque appelée JNativeHook, qui est raisonnablement facile à utiliser, mais je pense qu'il est possible d'utiliser Java uniquement pour cela. Suite à la recherche d'un moyen de le faire avec Python, je suis resté bloqué, je vais donc laisser un mémorandum.
La première chose que j'ai recherchée et trouvée à divers endroits était de savoir comment utiliser PyHook. Il semble que vous puissiez vous déplacer en arrière-plan et prendre des événements tels que la touche enfoncée et la touche haut (Intéressant divers sentiments-moss à propos de pyHook).
J'ai laissé tomber la version correspondante de pyHook de http://www.lfd.uci.edu/~gohlke/pythonlibs pour l'essayer.
wheel install pyHook‑1.5.1‑cp36‑cp36m‑win_amd64.whl
Installé avec (cela a pris beaucoup de temps en raison de problèmes de version, etc.).
from pyHook import HookManager
from win32gui import PumpMessages, PostQuitMessage
class Keystroke_Watcher(object):
def __init__(self):
self.hm = HookManager()
self.hm.KeyDown = self.on_keyboard_event
self.hm.HookKeyboard()
def on_keyboard_event(self, event):
try:
print ('MessageName:',event.MessageName)
print ('Ascii:', repr(event.Ascii), repr(chr(event.Ascii)))
print ('Key:', repr(event.Key))
print ('KeyID:', repr(event.KeyID))
print ('ScanCode:', repr(event.ScanCode))
print ('Time:',event.Time)
print ('-'*5)
finally:
return True
def your_method(self):
pass
def shutdown(self):
PostQuitMessage(0)
self.hm.UnhookKeyboard()
watcher = Keystroke_Watcher()
PumpMessages()
J'ai essayé de l'exécuter, mais cela fonctionne bien lorsque vous utilisez Emacs, SublimeText, mais dans une situation mystérieuse, cela tombe lorsque j'appuie sur une touche du navigateur Chrome. Comme une erreur
TypeError: KeyboardSwitch() missing 8 required positional arguments: 'msg', 'vk_code', 'scan_code', 'ascii', 'flags', 'time', 'hwnd', and 'win_name'
À la suite de l'enquête, il semble qu'il s'agisse d'un bogue qui se produit lors de l'exécution dans la série Python 3 (https://stackoverflow.com/questions/26156633/pythoncom-crashes-on-keydown-when-used-hooked -à-certaines-applications), dans un état de débordement.
PyHooked
Lorsque je cherchais une bonne alternative, j'ai trouvé quelque chose appelé pyHooked. L'installation est
pip install pyhooked
Et comme indiqué dans example.py sur la page Github,
from pyhooked import Hook, KeyboardEvent, MouseEvent
def handle_events(args):
if isinstance(args, KeyboardEvent):
print(args.key_code, args.current_key, args.event_type)
if isinstance(args, MouseEvent):
print(args.mouse_x, args.mouse_y)
hk = Hook() # make a new instance of PyHooked
hk.handler = handle_events # add a new shortcut ctrl+a, or triggered on mouseover of (300,400)
hk.hook() # hook into the events, and listen to the presses
En créant un gestionnaire d'événements, vous pouvez facilement prendre les entrées clavier et souris en arrière-plan.
Recommended Posts