C#使用全域鉤子(hook),SetWindowsHookEx返回0、不回調的解決

來源:互聯網
上載者:User

在.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。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.