Maison >développement back-end >C++ >Pourquoi mon hook de clavier global WPF C# cesse-t-il de fonctionner et comment puis-je y remédier ?
Utilisation du Global Keyboard Hook (WH_KEYBOARD_LL) dans WPF / C#
Pour résoudre le problème de l'auditeur de clavier qui cesse de fonctionner après une période de temps, il est essentiel de comprendre la cause du problème. La racine du problème réside dans la manière dont le délégué de rappel est créé et utilisé dans la méthode SetHook.
L'extrait de code suivant illustre le problème :
public static IntPtr SetHook(LowLevelKeyboardProc proc) { using (Process curProcess = Process.GetCurrentProcess()) using (ProcessModule curModule = curProcess.MainModule) { return SetWindowsHookEx(WH_KEYBOARD_LL, proc, GetModuleHandle(curModule.ModuleName), 0); } }
Dans ce code, le rappel Le délégué est créé en ligne dans l'appel de méthode SetHook et affecté au paramètre proc. Cependant, ce délégué n'est affecté à aucune autre variable ou propriété au sein de la classe ou de l'instance, ce qui signifie qu'il n'y a aucune référence à celui-ci qui l'empêche d'être récupéré.
Lorsque le délégué est récupéré, le pointeur de fonction qui a été transmis à SetWindowsHookEx devient invalide et le rappel ne peut plus être invoqué. C'est pourquoi l'auditeur cesse de fonctionner au bout d'un certain temps.
Pour résoudre ce problème, il est nécessaire de garder vivante une référence au délégué tant que le hook est en place. Ceci peut être réalisé en affectant le délégué à un champ ou une propriété au sein de la classe ou de l'instance. Par exemple :
private static LowLevelKeyboardProc _proc; public static IntPtr SetHook(LowLevelKeyboardProc proc) { _proc = proc; using (Process curProcess = Process.GetCurrentProcess()) using (ProcessModule curModule = curProcess.MainModule) { return SetWindowsHookEx(WH_KEYBOARD_LL, _proc, GetModuleHandle(curModule.ModuleName), 0); } }
En affectant le délégué au champ _proc, nous nous assurons qu'il reste vivant tant que la méthode SetHook est appelée. Cela empêche le ramasse-miettes de collecter le délégué et garantit que le rappel continue d'être invoqué.
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!