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.
Esto es realmente genial. Creo que es útil mencionar que puede funcionar sin una DLL implementando un ciclo de mensajes. – 79E09796