.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 環境中不會傳回有效句柄。
此解決方案涉及兩個關鍵改進:
強大的錯誤處理: 實作檢查以確保 GetModuleHandle
和 SetWindowsHookEx
傳回有效的句柄(而不是 IntPtr.Zero
)。 如果任一呼叫失敗,則應拋出 Win32Exception
以提供資訊性錯誤詳細資訊。
虛擬模組句柄: 對於低階滑鼠鉤子 (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中文網其他相關文章!