2011-01-03 42 views
9

He estado buscando por ahí, pero no puedo encontrar un ejemplo de cómo utilizar pyhook para responder a la tecla combinaciones como Ctrl +C que es fácil encontrar ejemplos de cómo responder a una sola presionar teclas como Ctrl o C por separado.Uso de pyhook para responder a la combinación de teclas (no solo teclas)

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

Cualquier ayuda apreciada.

Respuesta

7

¿Ha intentado utilizar el método GetKeyState de 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í es further documentation on GetKeyState

+0

Esto me está dando un error de sintaxis en Python 2.5 ... – Muhd

+0

Falta un ')' en la quinta línea. – Muhd

+3

Y GetKeyState parece no existir. – Muhd

6

Usted puede utilizar el código siguiente para ver lo que vuelve 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() 

el uso de este, parece que vuelve 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)

+1

sí, en realidad he intentado este código antes, pero parece que está procesando cada pulsación de tecla por separado aunque las mantenga presionadas al mismo tiempo. No creo que haya un código clave para una combinación de teclas. – reckoner

7

En realidad Ctrl + C tienen 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!" 
+1

Si bien esta respuesta es útil, no voy a votarla. Esto resuelve esta situación particular, pero ¿qué sucede si quiero capturar ** Shift + PrintScreen **? –

Cuestiones relacionadas