2012-05-09 91 views
5

我開發了一個使用全局鍵盤鍵/鼠標鉤子的應用程序。它適用於Windows 7,但不適用於Windows XP。在Windows XP中使用SetWindowsHookEx時出錯,但在Windows 7中不存在

當我打電話和SetWindowsHookEx在Windows XP中,我得到錯誤代碼1428

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

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

回答

11

奇怪的是,這個代碼不失敗Win7上,但我肯定沒試過。但這是正確的行爲,看起來他們改進了它。 SetWindowsHookEx()的參數驗證需要一個有效的非零的第3或第4個參數。錯誤代碼是描述性很強,從WinError.h中:

// 
// MessageId: ERROR_HOOK_NEEDS_HMOD 
// 
// MessageText: 
// 
// Cannot set nonlocal hook without a module handle. 
// 
#define ERROR_HOOK_NEEDS_HMOD   1428L 

任何模塊句柄會做,因爲它實際上並沒有得到用於低級別掛鉤,無DLL需要被注入,使他們的工作。由於其CLR不再爲純粹的託管程序集僞造模塊句柄,因此需要謹慎選擇.NET 4。使用LoadLibrary(「user32.dll」)是一個很好的選擇,因爲它總是被加載。您不必調用FreeLibrary()。

你需要這個聲明來調用LoadLibrary:

[DllImport("kernel32", SetLastError=true, CharSet = CharSet.Auto)] 
private static extern IntPtr LoadLibrary(string fileName); 
+0

謝謝你這麼多的精湛的響應。現在它可以在Windows 7和XP上運行。 – magol

+2

你的代碼中有另一個bug,SetWindowsHookEx()的返回類型是IntPtr,而不是int。 –

+0

oops,我在簡化代碼時犯了一些錯誤。在真實的代碼中,我使用從SafeHandleZeroOrMinusOneIsInvalid繼承的類。但是當我附加代碼時,我並不需要太多細節。 但是,無論如何感謝:-) – magol

相關問題