在.net 2005平台下 在使用全域hook時,總是遇見SetWindowsHookEx的傳回值為0,而且在:
DllImport的SetLastError選項 = true的時候,調用Marshal.GetLastWin32Error() 也返回0,那麼就看看是否這個原因:因為VS的偵錯模式的問題。
1.試試禁用宿主進程能否解決:
1). 在 Visual Studio 中開啟項目。
2). 在“項目”菜單上單擊“屬性”。
3). 單擊“調試”選項卡。
4). 清除“啟用 Visual Studio 宿主進程”複選框。
2.或者,使用WINDOWS API函數代替擷取當前執行個體的函數:
用:
[DllImport("kernel32.dll")]
public static extern IntPtr GetModuleHandle(string name);
GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName)
代替:
Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0])
當作 SetWindowsHookEx 的第三個參數: IntPtr
hInstance
3. 如果程式可以成功安裝鍵盤或滑鼠的鉤子,但是總是鉤不到鍵盤和滑鼠、或者回呼函數一直不被回調,請嘗試:
1) 檢查你的項目是不是視窗應用程式(控制台程式不行),回呼函數最好在主表單的類中。原因似乎因為全域鉤子回調需要寄宿在一個線程上,但是控制台應用程式中獲得的當前執行個體(IntPtr
hInstance)或許並不是當前程式的執行個體,而是一個控制台視窗的執行個體,回調的時候當然找不到回呼函數了。
2) 是否使用的是這兩個鉤子”WH_KEYBORAD_LL 和 WH_MOUSE_LL“,而不是”WH_KEYBORAD和WH_MOUSE_LL“。因為在C#這種managed環境下,如果想實現全域鉤子就必須使用low-level的hook。