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

為什麼我的全域滑鼠事件處理程序在 Windows 8 之前的系統上的 .NET 4 中沒有觸發?

Barbara Streisand
Barbara Streisand原創
2025-01-15 07:38:47490瀏覽

Why Isn't My Global Mouse Event Handler Firing in .NET 4 on Pre-Windows 8 Systems?

對 .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中文網其他相關文章!

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