首頁 > 後端開發 > C++ > 為什麼我的全域滑鼠事件處理程序在舊版 Windows 上的 .NET 4 中沒有觸發?

為什麼我的全域滑鼠事件處理程序在舊版 Windows 上的 .NET 4 中沒有觸發?

DDD
發布: 2025-01-15 06:55:43
原創
413 人瀏覽過

Why Isn't My Global Mouse Event Handler Firing in .NET 4 on Older Windows?

.NET 4(舊版 Windows)中的全域滑鼠事件處理程序故障排除

問題:

使用 .NET 4 時,旨在擷取滑鼠事件的自訂滑鼠鉤子在舊版 Windows 系統上無法如預期運作。訂閱的事件處理程序保持不活動狀態。

解:

此行為源自於 Windows 8 之前的作業系統上 .NET 4 公用語言執行階段 (CLR) 的變更。 CLR 不再自動為託管程式集產生非託管模組句柄。 此外,原始程式碼中錯誤處理不足加劇了問題。

最初的 SetWindowsHookEx 呼叫可能如下所示:

<code class="language-csharp">IntPtr hook = SetWindowsHookEx(WH_MOUSE_LL, proc, GetModuleHandle(curModule.ModuleName), 0);</code>
登入後複製

這在較舊的 Windows 版本上會失敗,因為 GetModuleHandle(curModule.ModuleName) 在 .NET 4 環境中不會傳回有效句柄。

此解決方案涉及兩個關鍵改進:

  1. 強大的錯誤處理: 實作檢查以確保 GetModuleHandleSetWindowsHookEx 傳回有效的句柄(而不是 IntPtr.Zero)。 如果任一呼叫失敗,則應拋出 Win32Exception 以提供資訊性錯誤詳細資訊。

  2. 虛擬模組句柄: 對於低階滑鼠鉤子 (WH_MOUSE_LL),不直接使用傳遞給 SetWindowsHookEx 的模組句柄。 因此,可以替換現成的句柄,例如 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();
}</code>
登入後複製

此修正後的程式碼可確保正確的錯誤處理並提供可靠的處理,解決了 .NET 4 下與舊 Windows 版本的不相容性問題。

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

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板