IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

Capturer frappe au clavier avec un hook


Sujet :

Windows Forms

  1. #1
    Membre du Club Avatar de Baud10
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Mai 2006
    Messages : 66
    Points : 47
    Points
    47
    Par défaut Capturer frappe au clavier avec un hook
    Bonjour

    Je recherche a capturer la frappe au clavier, notamment des touches multimédia (lecture, pause, son + fort ...), même si mon application n'est pas au premier plan. Solution, utiliser un crochet qui permet de recevoir toutes les frappes au clavier même celles qui ne sont pas destinées a mon application ?

    J'ai utiliser le tutorial http://humann.developpez.com/hook/ mais j'ai quelques problèmes.

    J'ai suivi le tutorial mais j'ai des erreurs de compilation, peut-être de débutant désolé.

    1:
    Dans "public void StartKeyHook()",
    Erreur à la ligne: "KeyboardHookProcedure = new HookProc(KeyHookProc);"
    a: KeyboardHookProcedure inconnu (attend un delegate);
    b: KeyHookProc inconnu (attend un int(int, int, IntPtr));

    Il existe bien la fonction "int KeyboardHookProc(int,int,intPtr)", mais je ne sais pas si je dois la mettre en leftvalue, ou la passer à HookProc. Je ne peux pas la passer aux deux manifestement.
    Dois-je créer un delegate explicite ? Je suis perdu !


    2:
    Dans "private int KeyboardHookProc(int nCode, Int32 wParam, IntPtr lParam)",
    Erreur à la ligne: "return CallNextHookEx(hKeyboardHook, nCode, wParam, lParam);"

    hKeyboardHook inconnu. Il attend un int, et hKeyboardHook semble être un handler, mais je ne sais pas du tout où aller le piocher...

    Merci d'avance pour votre aide

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Apparemment ce sont des identifiants qui ne sont pas déclarés...

    Sinon il y a une librairie qui marche très bien pour les hooks clavier/souris. Il y a aussi une discussion qui propose une source pour montrer comment l'utiliser

  3. #3
    Membre du Club Avatar de Baud10
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Mai 2006
    Messages : 66
    Points : 47
    Points
    47
    Par défaut
    J'ai modifié le code du tutorial pour le rendre correcte à la compilation :

    Nouveau code de StartKeyHook

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    int hKeyboardHook = 0; // (baud10) la Hwnd du hook rendu global
            public void StartKeyHook()
            {
                try
                {
                    HookProc KeyboardHookProcedure = new HookProc(KeyboardHookProc); // (baud10) rajouté le type "HookProc", modifié la cible du constructeur
                    //Installer le hook
                    int hKeyboardHook = SetWindowsHookEx(
                        WH_KEYBOARD_LL,
                        KeyboardHookProcedure,
                        Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]), 0); // (baud10) modifié le retour => dans la hwnd globale
                    //Si SetWindowsHookEx echoue
                    if (hKeyboardHook == 0)
                    {
                        int errorCode = Marshal.GetLastWin32Error();
                        MessageBox.Show("Impossible de capturer le hook (2)\r\n");
                    }
                    else
                    {
                        MessageBox.Show("Hook OK " + hKeyboardHook);
                        _onKeyDown += new KeyEventHandler(this.testtest);
                    }
                }
                catch (Exception ee)
                {
                    MessageBox.Show("Impossible de capturer le hook\r\n" + ee.Message);
                }
            }

    Le code compile maintenant.
    A l'éxécution de puis VS2008-administrateur, le HOOK me retourne l'erreur 126 (qui semble vouloir dire "Error: The specified module could not be found. (126)"). Lancer l'application localement et ça fonctionne.

    Je rajoute donc un abonnement de ma fonction à l'évènement global :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this._onKeyDown += new KeyEventHandler(this.testtest);
    Cela compile toujours, s'exécute sans erreur, mais la fonction testtest ne semble jamais être lancée. Si quelqu'un a une idée.

  4. #4
    Membre du Club Avatar de Baud10
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Mai 2006
    Messages : 66
    Points : 47
    Points
    47
    Par défaut
    J'ai résolu l'affaire. La variable manquante du Tutorial "HookProc KeyboardHookProcedure", que j'ai ajouté, je l'ai rajouté localement à la fonction "void StartKeyHook(void)" à tord. Il faut qu'elle soit globale à la classe où elle se trouve. Bref, en mettant ce delegate membre de la classe, le hook fonctionne.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème avec un hook clavier
    Par Definol dans le forum Windows
    Réponses: 0
    Dernier message: 02/02/2010, 15h12
  2. Réponses: 5
    Dernier message: 29/12/2005, 15h03
  3. Le buffer clavier avec cin, et getch()
    Par Info420 dans le forum SL & STL
    Réponses: 1
    Dernier message: 06/12/2004, 12h45
  4. [JEditorPane]Captures des touches claviers
    Par splend_f dans le forum Agents de placement/Fenêtres
    Réponses: 5
    Dernier message: 17/05/2004, 14h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo