2011-02-16 12 views
5

Hola chicos. Estoy tratando de obtener un gancho en Windows y usar Python para grabar las teclas. Para esto, estoy usando un procedimiento de devolución de llamada de LowLevelKeyboard.gancho de Windows con Python

def run(): 

    global KeyBdHook 
    global messages 

    KeyBdHook = HHook() 
    messages = [] 

    start = time.time() 

    #Record keystrokes for 2 seconds. 
    while time.time() < (start + 2): 
     KeyBdHook.hook = SetWindowsHookEx(13, KeyboardProc, 
              GetModuleHandle(0), 0) 
     if KeyBdHook.hook == 0: 
      print 'ERROR: '+str(ctypes.windll.kernel32.GetLastError()) 
     UnhookWindowsHookEx(KeyBdHook.hook) 

    print messages 

def KeyboardProc(nCode, wParam, lParam): 
    """http://msdn.microsoft.com/en-us/library/ms644985(v=vs.85).aspx""" 


    if nCode < 0: 
     return ctypes.windll.user32.GetNextHookEx(KeyBdHook.hook, 
               nCode, wParam, lParam) 
    else: 
     ctypes.windll.kernel32.RtlMoveMemory(ctypes.addressof(KeyBdHook.kStruct), 
              ctypes.c_void_p(lParam), 
              ctypes.sizeof(lParam)) 

     messages.append(KeyBdHook.kStruct) 
     return ctypes.windll.user32.GetNextHookEx(KeyBdHook.hook, 
              nCode, wParam, lParam) 


def SetWindowsHookEx(idHook, lpFn, hMod, dwThreadId): 
    WinFunc = ctypes.WINFUNCTYPE(c_ulong, c_ulong, c_ulong, c_ulong) 
    return ctypes.windll.user32.SetWindowsHookExA(idHook, WinFunc(lpFn), hMod, dwThreadId) 

def GetModuleHandle(lpModuleName): 
    return ctypes.windll.kernel32.GetModuleHandleA(lpModuleName) 

def UnhookWindowsHookEx(hHook): 
    return ctypes.windll.user32.UnhookWindowsHookEx(hHook) 

class HHook():   
    def __init__(self): 
     self.hook = HHOOK 
     self.kStruct = KBLLHOOKSTRUCT() 

class KBLLHOOKSTRUCT(Structure): 
    """http://msdn.microsoft.com/en-us/library/ms644967(v=vs.85).aspx""" 

    _fields_ = [("vkCode", c_ulong), 
       ("scanCode", c_ulong), 
       ("flags", c_ulong), 
       ("time", c_ulong), 
       ("dwExtraInfo", POINTER(c_ulong))] 

El problema con esto es que nunca entra en la función KeyboardProc. Estoy pensando que podría tener que lanzarlo como una función tipo C usando ctypes.WINFUNCTYPE o ctypes.CFUNCTYPE, pero no puedo resolverlo. Windows tampoco parece lanzar un error en SetWindowsEx.

Supongo que no está manejando el parámetro KeyboardProc que se pasa a SetWindowsEx. ¿Alguna idea sobre cómo lanzar esto para que Windows pueda ingresar datos en ella? Gracias.

Respuesta

3

Para resucitar una vieja pregunta, la creencia de ThiefMaster de que se requiere una dll no es precisa. Como un contraejemplo, he puesto un módulo de teclas de acceso directo de Python que implementa lo que pide el OP. This is the Github repo.

Además, para más funciones, recomiendo pyHook o pyhk..

Además, para más funciones, considere pywinauto, que incluye un módulo de teclas rápidas, y mucho más.

+0

Esto es realmente genial. Creo que es útil mencionar que puede funcionar sin una DLL implementando un ciclo de mensajes. – 79E09796

Cuestiones relacionadas