curioso que este código no falla en Win7, pero ciertamente nunca intentó. Pero es un comportamiento correcto, parece que lo mejoraron. La validación del argumento para SetWindowsHookEx() requiere un tercer o cuarto argumento válido que no sea cero. El código de error es muy descriptivo, desde Winerror.h:
//
// MessageId: ERROR_HOOK_NEEDS_HMOD
//
// MessageText:
//
// Cannot set nonlocal hook without a module handle.
//
#define ERROR_HOOK_NEEDS_HMOD 1428L
Cualquier asa del módulo va a hacer, ya que en realidad no se acostumbre a los ganchos de bajo nivel, sin DLL tiene que ser inyectado para hacerlos funcionar. Se requiere cierto cuidado en la selección de .NET 4 ya que su CLR ya no simula los identificadores de módulo para ensamblajes administrados puros. Uno bueno para usar es el que obtienes de pinvoking LoadLibrary ("user32.dll") ya que siempre está cargado. No tiene que llamar a FreeLibrary().
que necesitará esta declaración para llamar a LoadLibrary:
[DllImport("kernel32", SetLastError=true, CharSet = CharSet.Auto)]
private static extern IntPtr LoadLibrary(string fileName);
muchas gracias por la respuesta excelente. Ahora funciona tanto en Windows 7 como en XP. – magol
Tiene otro error en su código, el tipo de retorno para SetWindowsHookEx() es IntPtr, no int. –
Vaya, cometí algunos errores cuando simplifiqué el código. En el código real, utilizo una clase que hereda de SafeHandleZeroOrMinusOneIsInvalid. Pero no quería demasiados detalles cuando adjunté el código. Pero gracias de todos modos :-) – magol