Ninguna de las respuestas proporcionadas me ayudó a resolver mi problema, pero yo mismo encontré la respuesta. Aquí está.
El uso de SetWindowsHookEx()
con WH_KEYBOARD_LL
fue el enfoque correcto. Sin embargo, los otros parámetros a SetWindowsHookEx()
son poco intuitivo:
- El último parámetro,
dwThreadId
, tiene que ser 0.
- La segunda último parámetro,
hMod
, necesita para que apunte a algunos DLL. Usé User32
, que es una DLL que siempre se carga de todos modos y es utilizada por todos los procesos con una GUI. Obtuve esta idea desde a CodeProject post about this.
De este modo, el código se ve un poco como esto:
instance = LoadLibrary("User32");
hhook = SetWindowsHookEx(WH_KEYBOARD_LL, hookFunction, instance, 0);
La documentación es clara la segunda último parámetro. Dice:
El parámetro hMod debe establecerse en NULL [...] si el procedimiento de enlace está dentro del código asociado con el proceso actual.
No indica que esto sólo se aplica a algunos tipos de ganchos, pero no a WH_KEYBOARD_LL
y WH_MOUSE_LL
.
Sí, es lo que quieren decir - para un gancho de ratón de bajo nivel o el teclado (o cualquier otro gancho local) HMOD debe ser IntPtr.Zero. –
Hmmm, dices que las otras publicaciones no fueron útiles, luego procede a publicar la misma respuesta que nobugz ya proporcionó y marca la tuya como la respuesta correcta. –
Nobugz no dice qué hacer con hMod en absoluto, y, contrariamente a su primer comentario, esta respuesta sugiere que hMod se establezca en algo ** diferente ** a IntPtr.Zero. –