Dépannage des gestionnaires d'événements de souris globaux dans .NET 4 (anciennes Windows)
Problème :
Un hook de souris personnalisé, conçu pour capturer les événements de la souris, ne fonctionne pas comme prévu sur les anciens systèmes Windows lors de l'utilisation de .NET 4. Le gestionnaire d'événements abonné reste inactif.
Résolution :
Ce comportement provient de modifications apportées au Common Language Runtime (CLR) .NET 4 sur les systèmes d'exploitation antérieurs à Windows 8. Le CLR ne génère plus automatiquement des handles de module non gérés pour les assemblys gérés. De plus, une gestion insuffisante des erreurs dans le code d'origine aggrave le problème.
L'appel SetWindowsHookEx
original ressemblait probablement à ceci :
<code class="language-csharp">IntPtr hook = SetWindowsHookEx(WH_MOUSE_LL, proc, GetModuleHandle(curModule.ModuleName), 0);</code>
Cela échoue sur les anciennes versions de Windows car GetModuleHandle(curModule.ModuleName)
ne renvoie pas de handle valide dans l'environnement .NET 4.
La solution implique deux améliorations clés :
Gestion robuste des erreurs : Mettez en œuvre des vérifications pour garantir que GetModuleHandle
et SetWindowsHookEx
renvoient des identifiants valides (et non IntPtr.Zero
). Si l'un des appels échoue, un Win32Exception
doit être lancé pour fournir des détails informatifs sur l'erreur.
Poignée de module factice : Pour les crochets de souris de bas niveau (WH_MOUSE_LL
), la poignée de module passée à SetWindowsHookEx
n'est pas directement utilisée. Par conséquent, un identifiant facilement disponible, tel que celui de user32.dll
(toujours chargé dans une application .NET), peut être remplacé.
Voici le code révisé intégrant ces améliorations :
<code class="language-csharp">IntPtr hook = SetWindowsHookEx(WH_MOUSE_LL, proc, GetModuleHandle("user32"), 0); if (hook == IntPtr.Zero) { throw new System.ComponentModel.Win32Exception(); }</code>
Ce code corrigé garantit une bonne gestion des erreurs et fournit une gestion fiable, résolvant l'incompatibilité avec les anciennes versions de Windows sous .NET 4.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!