Dépannage d'un gestionnaire d'événements de souris global qui ne se déclenche pas dans .NET 4 (pré-Windows 8)
Cet article explique pourquoi un gestionnaire global d'événements de souris peut ne pas fonctionner correctement dans .NET Framework 4 sur les systèmes d'exploitation antérieurs à Windows 8, et propose une solution.
Explication du code
Le code utilise l'API SetWindowsHookEx
pour créer un hook de souris global et définit un événement MouseAction
. La fonction HookCallback
traite les événements de souris de bas niveau, déclenchant l'événement MouseAction
lors d'un clic gauche.
Le problème : SetWindowsHookEx
Échec
Le problème réside dans l'appel de fonction SetWindowsHookEx
. Sur les systèmes antérieurs à Windows 8, le .NET 4 CLR n’émule pas les handles de modules non gérés pour les assemblys managés. Cela provoque l'échec de GetModuleHandle
(utilisé pour obtenir le handle de l'assembly actuel), ce qui entraîne le retour de SetWindowsHookEx
IntPtr.Zero
.
Gestion des erreurs manquantes
Le code original manque de gestion des erreurs cruciales. Les fonctions WinAPI ne génèrent pas d'exceptions ; vous devez vérifier explicitement les valeurs de retour.
La solution : utiliser un handle de module connu
Le correctif consiste à remplacer l'appel GetModuleHandle
par un handle de module connu et valide. Puisque user32.dll
est toujours chargé dans une application .NET, son handle fonctionne parfaitement.
Extrait de code corrigé
Voici le segment de code corrigé :
<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>
L'ajout de cette vérification d'erreur et l'utilisation de la poignée user32.dll
garantissent que l'événement MouseAction
se déclenche de manière fiable, rétablissant ainsi la fonctionnalité attendue de gestion des clics de souris.
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!