.NET Framework 4 中的全域滑鼠事件處理
本文解決了在 Windows 8 之前的 Windows 版本上執行的 .NET Framework 4 應用程式中實作全域滑鼠事件處理程序時遇到的常見問題。這個問題源自於 CLR 處理託管程序集的非託管模組句柄的方式。
以下程式碼示範了擷取全域滑鼠事件的典型方法,該方法在較舊的 Windows 系統上通常會失敗:
<code class="language-csharp">public static class MouseHook { public static event EventHandler MouseAction = delegate { }; // ... other code ... }</code>
核心問題就在這段:
<code class="language-csharp">return SetWindowsHookEx(WH_MOUSE_LL, proc, GetModuleHandle(curModule.ModuleName), 0);</code>
在 .NET Framework 4 和更早的 Windows 版本上,GetModuleHandle(curModule.ModuleName)
可能會傳回無效句柄,因為 CLR 不再自動為託管程式集提供模擬的非託管模組句柄。 原始程式碼中缺乏錯誤處理掩蓋了此故障。 Win32 API 不會拋出異常,導致靜默失敗。
此解決方案涉及強大的錯誤檢查和更可靠的獲取模組句柄的方法。 我們可以使用已知的載入模組,例如 curModule.ModuleName
,而不是依賴 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>
此修訂後的程式碼明確檢查 IntPtr.Zero
的 SetWindowsHookEx
傳回值,如果掛鉤安裝失敗,則拋出 Win32Exception
。 這提供了清晰的錯誤報告並防止無提示的故障。 使用 GetModuleHandle("user32")
確保始終提供有效的句柄,解決與舊 Windows 版本的不相容性問題。 這種方法可確保在更廣泛的 Windows 作業系統上進行可靠的全域滑鼠事件處理。
以上是為什麼我的全域滑鼠事件處理程序不會在 8 之前的 Windows 版本上的 .NET Framework 4 中觸發?的詳細內容。更多資訊請關注PHP中文網其他相關文章!