Maison >développement back-end >C++ >Pourquoi mon gestionnaire d'événements de souris global ne se déclenche-t-il pas dans .NET Framework 4 sur les versions Windows antérieures à 8 ?
Gestion globale des événements de souris dans .NET Framework 4
Cet article traite d'un problème courant rencontré lors de l'implémentation de gestionnaires d'événements de souris globaux dans les applications .NET Framework 4 exécutées sur des versions de Windows antérieures à Windows 8. Le problème provient de la façon dont le CLR gère les handles de modules non gérés pour les assemblys gérés.
Le code suivant illustre une approche typique pour capturer les événements globaux de la souris, qui échoue souvent sur les anciens systèmes Windows :
<code class="language-csharp">public static class MouseHook { public static event EventHandler MouseAction = delegate { }; // ... other code ... }</code>
Le problème principal réside dans cette section :
<code class="language-csharp">return SetWindowsHookEx(WH_MOUSE_LL, proc, GetModuleHandle(curModule.ModuleName), 0);</code>
Sur .NET Framework 4 et les versions antérieures de Windows, GetModuleHandle(curModule.ModuleName)
peut renvoyer un handle non valide car le CLR ne fournit plus automatiquement un handle de module non géré simulé pour les assemblys gérés. Le manque de gestion des erreurs dans le code original masque cet échec. L'API Win32 ne génère pas d'exceptions, ce qui entraîne des échecs silencieux.
La solution implique une vérification robuste des erreurs et un moyen plus fiable d'obtenir un descripteur de module. Au lieu de s'appuyer sur curModule.ModuleName
, nous pouvons utiliser un module chargé connu, tel que user32.dll
, qui est toujours présent dans les applications .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>
Ce code révisé vérifie explicitement une IntPtr.Zero
valeur de retour de SetWindowsHookEx
, en lançant un Win32Exception
si l'installation du hook échoue. Cela fournit un rapport d’erreurs clair et évite les pannes silencieuses. L'utilisation de GetModuleHandle("user32")
garantit qu'un handle valide est toujours fourni, résolvant ainsi l'incompatibilité avec les anciennes versions de Windows. Cette approche garantit une gestion globale et fiable des événements de souris sur une gamme plus large de systèmes d'exploitation Windows.
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!