古い .NET バージョンでのグローバル マウス イベント ハンドラーのトラブルシューティング
問題:
一般的なメソッドを使用して実装されたグローバル マウス イベント ハンドラーは、.NET Framework 4 以前のバージョンではイベントをトリガーできません。
説明:
問題は、GetModuleHandle(curModule.ModuleName)
呼び出し内で SetWindowsHookEx
を使用することに起因します。 .NET 4 以前、および Windows 8 より前の Windows バージョンでは、共通言語ランタイム (CLR) はマネージ アセンブリのアンマネージ モジュール ハンドルを生成しません。 その結果、GetModuleHandle(curModule.ModuleName)
は無効なハンドルを返し、SetWindowsHookEx
がフックを登録できなくなります。
解決策:
解決策には、たとえ低レベルのマウスフックには必ずしも必要ではない場合でも、有効なモジュールハンドルを SetWindowsHookEx
に提供することが含まれます。 修正されたコードは次のとおりです:
<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 アプリケーションに一貫してロードされるモジュールである user32.dll
のハンドルを取得します。 これにより、SetWindowsHookEx
の有効なハンドルが保証されます。 関数呼び出しが失敗した場合に Win32Exception
をスローすることで、エラー処理が改善されました。
以上がグローバル マウス イベント ハンドラーが .NET 4 以前のバージョンで起動しないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。