對 .NET 4(Windows 8 之前的版本)中的非觸發全域滑鼠事件處理程序進行故障排除
本文解釋了為什麼全域滑鼠事件處理程序可能無法在早於 Windows 8 的作業系統上的 .NET Framework 4 中正常運作,並提供了解決方案。
代碼說明
程式碼使用 SetWindowsHookEx
API 建立全域滑鼠鉤子並定義 MouseAction
事件。 HookCallback
函數處理低階滑鼠事件,在左鍵點擊時引發 MouseAction
事件。
問題:SetWindowsHookEx
失敗
問題出在 SetWindowsHookEx
函數呼叫。 在 Windows 8 之前的系統上,.NET 4 CLR 不會模擬託管組件的非託管模組句柄。 這會導致 GetModuleHandle
(用於取得目前組件的句柄)失敗,導致 SetWindowsHookEx
回傳 IntPtr.Zero
。
缺少錯誤處理
原始程式碼缺乏關鍵的錯誤處理。 WinAPI 函數不會拋出異常; 您必須明確檢查回傳值。
解:使用已知的模組句柄
修正涉及用已知的有效模組句柄替換 GetModuleHandle
呼叫。 由於 user32.dll
始終加載在 .NET 應用程式中,因此其句柄可以完美運行。
更正的程式碼片段
這是修正後的程式碼段:
<code class="language-csharp">IntPtr hook = SetWindowsHookEx(WH_MOUSE_LL, proc, GetModuleHandle("user32"), 0); if (hook == IntPtr.Zero) { throw new System.ComponentModel.Win32Exception(); } return hook;</code>
新增此錯誤檢查並使用 user32.dll
句柄可確保 MouseAction
事件可靠觸發,恢復預期的滑鼠點擊處理功能。
以上是為什麼我的全域滑鼠事件處理程序在 Windows 8 之前的系統上的 .NET 4 中沒有觸發?的詳細內容。更多資訊請關注PHP中文網其他相關文章!