首頁 >後端開發 >C++ >為什麼我的全域滑鼠事件處理程序不會在 8 之前的 Windows 版本上的 .NET Framework 4 中觸發?

為什麼我的全域滑鼠事件處理程序不會在 8 之前的 Windows 版本上的 .NET Framework 4 中觸發?

Susan Sarandon
Susan Sarandon原創
2025-01-15 06:04:51985瀏覽

Why Doesn't My Global Mouse Event Handler Fire in .NET Framework 4 on Windows Versions Earlier Than 8?

.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.ZeroSetWindowsHookEx 傳回值,如果掛鉤安裝失敗,則拋出 Win32Exception。 這提供了清晰的錯誤報告並防止無提示的故障。 使用 GetModuleHandle("user32") 確保始終提供有效的句柄,解決與舊 Windows 版本的不相容性問題。 這種方法可確保在更廣泛的 Windows 作業系統上進行可靠的全域滑鼠事件處理。

以上是為什麼我的全域滑鼠事件處理程序不會在 8 之前的 Windows 版本上的 .NET Framework 4 中觸發?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn