.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 中国語 Web サイトの他の関連記事を参照してください。