2012-05-09 26 views
5

He desarrollado una aplicación que utiliza un enlace global de teclado/mouse. Funciona perfecto en Windows 7, pero no en Windows XP.Error al usar SetWindowsHookEx en Windows XP, pero no en Windows 7

Cuando llamo SetWindowsHookEx en Windows XP, me sale el código de error 1428

int MouseLowLevel = 14 
int code = SetWindowsHookEx(MouseLowLevel, 
       MouseHookProc, 
       IntPtr.Zero, 
       0); 

private IntPtr MouseHookProc(int nCode, IntPtr wParam, IntPtr lParam) {} 

Respuesta

11

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); 
+0

muchas gracias por la respuesta excelente. Ahora funciona tanto en Windows 7 como en XP. – magol

+2

Tiene otro error en su código, el tipo de retorno para SetWindowsHookEx() es IntPtr, no int. –

+0

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

Cuestiones relacionadas