¿Utilizando pyhook para responder a la combinación de teclas (no solo pulsaciones simples)?

He estado buscando, pero no puedo encontrar un ejemplo de cómo usar Pyhook para responder a combinaciones de teclas como Ctrl + C, mientras que es fácil encontrar ejemplos de cómo responder a pulsaciones de una tecla como Ctrl o C por separado.

Por cierto, estoy hablando de Python 2.6 en Windows XP.

Cualquier ayuda apreciada.

¿Ha intentado utilizar el método GetKeyState desde HookManager? No he probado el código pero debería ser algo como esto:

from pyHook import HookManager from pyHook.HookManager import HookConstants def OnKeyboardEvent(event): ctrl_pressed = HookManager.GetKeyState(HookConstants.VKeyToID('VK_CONTROL') >> 15) if ctrl_pressed and HookConstant.IDToName(event.keyId) == 'c': # process ctrl-c 

Aquí hay más documentación sobre GetKeyState

En realidad, Ctrl + C tiene su propio código Ascii (que es 3). Algo como esto funciona para mí:

 import pyHook,pythoncom def OnKeyboardEvent(event): if event.Ascii == 3: print "Hello, you've just pressed ctrl+c!" 

Puedes usar el siguiente código para ver qué devuelve pyHook:

 import pyHook import pygame def OnKeyboardEvent(event): 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 '---' hm = pyHook.HookManager() hm.KeyDown = OnKeyboardEvent hm.HookKeyboard() # initialize pygame and start the game loop pygame.init() while True: pygame.event.pump() 

usando esto, parece que devuelve pyHook

 c: Ascii 99, KeyID 67, ScanCode 46 ctrl: Ascii 0, KeyID 162, ScanCode 29 ctrl+c: Ascii 3, KeyID 67, ScanCode 46 

(Python 2.7.1, Windows 7, pyHook 1.5.1)

No tuve suerte con ninguna de las otras respuestas, así que esto es lo que tomé para hacer

 class Keystroke_Watcher: def __init__(self, master): self.hm = HookManager() self.hm.KeyDown = self.on_key_down self.hm.KeyUp = self.on_key_up self.hm.HookKeyboard() self.keys_held = set() # set of all keys currently being pressed def get_key_combo_code(self): # find some way of encoding the presses. return '+'.join([HookConstants.IDToName(key) for key in self.keys_held]) def on_key_down(self, event): try: self.keys_held.add(event.KeyID) finally: return True def on_key_up(self, event): keycombo = self.get_key_combo_code() print(keycombo) try: # Do whatever you want with your keycombo here finally: self.keys_held.remove(event.KeyID) return True def shutdown(self): PostQuitMessage(0) self.hm.UnhookKeyboard()