Pregunta

Estoy utilizando SetWindowsHookEx () para crear un enlace de teclado. La creación parece tener éxito, pero el procedimiento que se ha registrado nunca se llama. ¿Hay algo que estoy haciendo mal?

#region Windows API Functions Declarations

[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
private static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);

[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
private static extern bool UnhookWindowsHookEx(int idHook);

[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
private static extern int CallNextHookEx(int idHook, int nCode, IntPtr wParam, IntPtr lParam);

[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr GetModuleHandle(string lpModuleName);

#endregion

=

private void CreateHook()
{
   int id_hook = (int)HookType.WH_KEYBOARD_LL;
   HookProc lpfn = new HookProc(this.KeyboardHookProc);

   using (ProcessModule curModule = Process.GetCurrentProcess().MainModule)
      hHook = SetWindowsHookEx(id_hook, lpfn, GetModuleHandle(curModule.ModuleName), 0);

   if (hHook == 0)
      throw new Exception("could not start monitoring mouse events");
}

=

private int KeyboardHookProc(int code, IntPtr wParam, IntPtr lParam)
{
   if (code >= 0)
      Console.WriteLine((Keys)wParam.ToInt32());
   return CallNextHookEx(0, code, wParam, lParam);
}

=

¿Fue útil?

Solución

Sus P / Invoke declaraciones están equivocados, que están utilizando int donde se requiere IntPtr y mezclar idHook y hHook. Después de editar el código, esto funcionó:

IntPtr hHook;
private delegate IntPtr HookProc(int nCode, IntPtr wp, IntPtr lp);
HookProc lpfn;

private IntPtr KeyboardHookProc(int code, IntPtr wParam, IntPtr lParam) {
  if (code >= 0)
    Console.WriteLine((Keys)wParam.ToInt32());
  return CallNextHookEx(hHook, code, wParam, lParam);
}

private void CreateHook() {
  int id_hook = 13;
  lpfn = new HookProc(this.KeyboardHookProc);
  using (ProcessModule curModule = Process.GetCurrentProcess().MainModule)
    hHook = SetWindowsHookEx(id_hook, lpfn, GetModuleHandle(curModule.ModuleName), 0);
  if (hHook == IntPtr.Zero)
    throw new Exception("could not start monitoring mouse events");
}
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
private static extern IntPtr SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
private static extern bool UnhookWindowsHookEx(IntPtr hHook);
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
private static extern IntPtr CallNextHookEx(IntPtr hHook, int nCode, IntPtr wParam, IntPtr lParam);
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr GetModuleHandle(string lpModuleName);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top