Fehlerbehebung bei globalen Maus-Ereignishandlern in älteren .NET-Versionen
Problem:
Ein globaler Maus-Ereignishandler, der mit gängigen Methoden implementiert wurde, löst in .NET Framework 4 und früheren Versionen keine Ereignisse aus.
Erklärung:
Das Problem ergibt sich aus der Verwendung von GetModuleHandle(curModule.ModuleName)
innerhalb des SetWindowsHookEx
-Aufrufs. In .NET 4 und früher generiert die Common Language Runtime (CLR) in Windows-Versionen vor Windows 8 keine nicht verwalteten Modulhandles für verwaltete Assemblys. Folglich gibt GetModuleHandle(curModule.ModuleName)
ein ungültiges Handle zurück und verhindert, dass SetWindowsHookEx
den Hook registriert.
Auflösung:
Die Lösung besteht darin, SetWindowsHookEx
ein gültiges Modulhandle bereitzustellen, auch wenn dies für Maus-Hooks auf niedriger Ebene nicht unbedingt erforderlich ist. Hier ist der korrigierte Code:
<code class="language-csharp">IntPtr hook = SetWindowsHookEx(WH_MOUSE_LL, proc, GetModuleHandle("user32"), 0); if (hook == IntPtr.Zero) { throw new System.ComponentModel.Win32Exception(); }</code>
Dieser überarbeitete Code erhält das Handle für user32.dll
, ein Modul, das konsistent in .NET-Anwendungen geladen wird. Dadurch wird ein gültiges Handle für SetWindowsHookEx
sichergestellt. Die Fehlerbehandlung wird verbessert, indem ein Win32Exception
ausgelöst wird, wenn der Funktionsaufruf fehlschlägt.
Das obige ist der detaillierte Inhalt vonWarum wird mein globaler Maus-Ereignishandler in .NET 4 und früheren Versionen nicht ausgelöst?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!