Maison >développement back-end >C++ >Pourquoi mon hook de clavier global WPF cesse-t-il de fonctionner et comment puis-je y remédier ?

Pourquoi mon hook de clavier global WPF cesse-t-il de fonctionner et comment puis-je y remédier ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-29 01:27:14220parcourir

Why Does My WPF Global Keyboard Hook Stop Working, and How Can I Fix It?

Utilisation du crochet de clavier global (WH_KEYBOARD_LL) dans WPF / C# : dépannage de la disparition du rappel

Dans le code fourni, le crochet de clavier global est établi en utilisant la méthode SetHook. Cependant, il existe un problème potentiel où le délégué hook, défini en ligne dans l'appel SetHook, n'est pas correctement référencé et peut être récupéré. Cela entraîne l'échec de la fonction de rappel et aucun autre événement clavier n'est reçu.

Solution :

Pour résoudre ce problème, il est nécessaire de créer explicitement le délégué de rappel. et en conserver une référence dans l’application. Cela peut être fait en déclarant la variable déléguée en dehors de la méthode SetHook et en la passant comme argument :

public class App : Application
{
    private KeyboardListener KListener;
    private LowLevelKeyboardProc hookCallback;

    private void Application_Startup(object sender, StartupEventArgs e)
    {
        hookCallback = HookCallback;
        KListener = new KeyboardListener(hookCallback);
        KListener.KeyDown += new RawKeyEventHandler(KListener_KeyDown);
    }

    private void Application_Exit(object sender, ExitEventArgs e)
    {
        KListener.Dispose();
    }
}

Dans ce code mis à jour :

  1. Le délégué LowLevelKeyboardProc est déclaré comme un champ privé nommé hookCallback.
  2. Dans la méthode Application_Startup, le délégué hookCallback est passé en argument au Constructeur KeyboardListener.
  3. L'instance KListener est créée et fait référence au rappel à l'aide du constructeur d'instance.

En conservant une référence au délégué, la fonction de rappel restera dans la portée et continuera pour recevoir les événements du clavier comme prévu, résolvant ainsi le problème où le hook cesse de fonctionner après un certain temps.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn