Maison >développement back-end >C++ >Pourquoi mon gestionnaire d'événements global de souris ne se déclenche-t-il pas dans .NET 4 et les versions antérieures ?
Dépannage des gestionnaires d'événements de souris globaux dans les anciennes versions de .NET
Problème :
Un gestionnaire d'événements de souris global, implémenté à l'aide de méthodes courantes, ne parvient pas à déclencher des événements dans .NET Framework 4 et les versions antérieures.
Explication :
Le problème vient de l'utilisation de GetModuleHandle(curModule.ModuleName)
dans l'appel SetWindowsHookEx
. Dans .NET 4 et versions antérieures, sur les versions de Windows antérieures à Windows 8, le Common Language Runtime (CLR) ne génère pas de handles de module non gérés pour les assemblys managés. Par conséquent, GetModuleHandle(curModule.ModuleName)
renvoie un handle invalide, empêchant SetWindowsHookEx
d'enregistrer le hook.
Résolution :
La solution consiste à fournir un handle de module valide à SetWindowsHookEx
, même si ce n'est pas strictement nécessaire pour les hooks de souris de bas niveau. Voici le 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(); }</code>
Ce code révisé obtient le handle de user32.dll
, un module chargé de manière cohérente dans les applications .NET. Cela garantit un identifiant valide pour SetWindowsHookEx
. La gestion des erreurs est améliorée en lançant un Win32Exception
si l'appel de fonction échoue.
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!