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

C Discussion :

SetWindowsHookEx: Erreur 0x57


Sujet :

C

  1. #1
    Futur Membre du Club
    Inscrit en
    Février 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 6
    Points : 6
    Points
    6
    Par défaut SetWindowsHookEx: Erreur 0x57
    Bonjour à tous.

    Je souhaite faire un hook clavier d'un seul processus. Pour cela je me suis documenté sur les pages suivantes: http://tcharles.developpez.com/simul/ et sur MSDN.

    Je pense avoir compris le principe mais j'ai cependant une erreur lors de l'exécution:
    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
    29
    30
    31
    32
    33
    34
    35
    36
    void hookClavier() {
     
        HWND hWindow;
        DWORD threadID;
        HHOOK clavier;
     
        hWindow=GetForegroundWindow(); // On recupere le handle de la fenetre au premier plan
        printf("le handle de la fenetre au premier plan est : 0x%X\n",hWindow);
     
        GetWindowThreadProcessId(hWindow,&threadID); // on recupere l'id du thread de la fenetre au premier plan depuis son handle
        printf("l'id est %u\n",threadID);
     
        clavier=SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC) &routineITClavier,NULL,threadID); // on met en place le hook
     
        if(clavier!=NULL)
            printf("Hook en place!! \n");
        else {
            printf("Le hook n'est pas en place!!\n");
            hWindow=(HWND) GetLastError(); // On recupere la derniere erreur
            printf("L'erreur est %u\n",hWindow);
        }
     
        UnhookWindowsHookEx(clavier); // on retire le hook
    }
     
     
     
     
     
    LRESULT CALLBACK routineITClavier(int nCode, WPARAM wParam, LPARAM lParam) {
     
        printf("Une touche a ete pressee.\n");
     
        return CallNextHookEx(NULL, nCode, wParam, lParam);
     
    }


    Lors de l'exécution le programme affiche bien le handle et l'id, puis m'affiche ensuite une belle erreur 0x57.

    D'après cette page http://msdn.microsoft.com/en-us/libr...=VS.85%29.aspx l'erreur correspond à un paramètre invalide.


    Je précise que j'ai seulement 3 warning à la compilation (concernant les printf), que je suis sous Windows XP pro et que j'utilise code blocks 8.02.

    Si quelqu'un à une réponse, un lien ou une piste, je lui en serais reconnaissant.

    Merci de votre lecture.


    Mogg41

  2. #2
    Futur Membre du Club
    Inscrit en
    Février 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 6
    Points : 6
    Points
    6
    Par défaut
    Je réponds moi même à ma question. J'avais fait 2 erreurs:
    - j'envoyais l'ID du thread au lieu du processus
    - je lançais le programme depuis codeblocks au lieu de lancer l'exécutable.

    J'ai corrigé cela, ce qui donne le code suivant:

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    void hookClavier() {
     
        HWND hWindow;
        DWORD threadID;
        HHOOK clavier;
        DWORD processID;
     
        hWindow=GetForegroundWindow(); // On recupere le handle de la fenetre au premier plan
        printf("le handle de la fenetre au premier plan est : 0x%X\n",hWindow);
     
        processID=GetWindowThreadProcessId(hWindow,&threadID); // on recupere l'id du thread et du processus de la fenetre au premier plan depuis son handle
        printf("l'id est %u\n",threadID);
        printf("l'id est %u\n",processID);
     
        clavier=SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC) &routineITClavier,NULL,processID); // on met en place le hook
     
        if(clavier!=NULL) //
            printf("Hook en place!! \n");
        else {
            printf("Le hook n'est pas en place!!\n");
            hWindow=(HWND) GetLastError(); // On recupere la derniere erreur
            printf("L'erreur est %u\n",hWindow);
        }
     
        process1();
     
        UnhookWindowsHookEx(clavier); // on retire le hook
    }
     
     
     
     
    LRESULT CALLBACK routineITClavier(int nCode, WPARAM wParam, LPARAM lParam) {
     
        printf("Une touche a ete pressee.\n");
        exit(-1);
     
        return CallNextHookEx(NULL, nCode, wParam, lParam);
     
    }
     
     
     
    void process1() {
        int i=0;
     
     
        while(i<99999999999) {
            if(i%54000==0)
                printf("%d ",i);
            i++;
        }
    }

    Le hook ne fonctionne pour l'instant pas mais je vais réfléchir au problème avant de vous harceler de questions

Discussions similaires

  1. SetWindowsHookEx - Erreur 1427
    Par JulienC dans le forum C
    Réponses: 2
    Dernier message: 19/08/2010, 19h20
  2. Erreur 1428 SetWindowsHookEx
    Par Invité dans le forum C
    Réponses: 6
    Dernier message: 14/02/2010, 09h59
  3. Réponses: 2
    Dernier message: 27/05/2002, 19h46
  4. erreur IDL:omg.org/CORBA/MARSHAL:1.0
    Par Pinggui dans le forum CORBA
    Réponses: 3
    Dernier message: 13/05/2002, 15h05
  5. [Kylix] Erreur objet
    Par Anonymous dans le forum EDI
    Réponses: 1
    Dernier message: 22/03/2002, 09h41

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