Hook Global - Répétition de la touche ^

Signaler
Messages postés
86
Date d'inscription
dimanche 8 janvier 2006
Statut
Membre
Dernière intervention
5 décembre 2010
-
Messages postés
86
Date d'inscription
dimanche 8 janvier 2006
Statut
Membre
Dernière intervention
5 décembre 2010
-
    Bonjour à Tous,

Je suis parvenu à créer un Hook pour mon programme avec l'aide des codes qu'il y a sur le site mais lorsque mon Hook est activé, la pression de la touche ^ est doublé automtiquement lorsqu'on appuie une seul fois ! :o

Je viens de terminer mon logiciel et il ne me reste plus que ce beug à corriger. Sauriez-vous comment corriger ce problème !?

Merci Beaucoup pour votre Aide ! ;)

4 réponses

Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
Je lance le prog et je ne note pas de doublage de touche.


DLL:
#include <windows.h>
HINSTANCE thismod = 0;
HHOOK hhk = 0;


#pragma comment(linker, "/entry:myDllMain")
__declspec(naked) int __stdcall myDllMain(HINSTANCE hdll, DWORD dwReason, LPVOID Reserved){ // DLL_PROCESS_DETACH 0, DLL_PROCESS_ATTACH 1
  __asm {
    mov     eax, [esp+8]  ; dwReason
    mov     edx, [esp+4]  ; hdll
    dec     eax
    jne     short mainRET
    mov     thismod, edx
mainRET:
    mov     eax, 1
    ret     12
  }
}


// TRAITEMENT ULTRA MINIMAL
LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
  return CallNextHookEx(0, nCode, wParam, lParam);
}




int __stdcall Intercepte()
{
  if(!hhk) {
    hhk  = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, thismod, 0);
  }
  return (int) hhk;
}


void __stdcall Relache()
{
  if(hhk) {
    UnhookWindowsHookEx(hhk); hhk = 0;
  }
}
----------------------
PROG UTILISATEUR:
#include <windows.h>
#include "resource.h"


#pragma comment(lib, "bnkbd.lib")
int __stdcall Intercepte();
void __stdcall Relache();


BOOL CALLBACK AppDlgProc(HWND hdlg, UINT mssg, WPARAM wParam, LPARAM lParam)
{
  switch(mssg) {
    case WM_INITDIALOG:
      if(!Intercepte()) goto dlgEND;
      SetClassLongPtr(hdlg, GCLP_HICON, (long)LoadIcon(0, IDI_APPLICATION));
      return 1;
    case WM_COMMAND:
      if(wParam != IDCANCEL) break;
      Relache();
  dlgEND:
      EndDialog(hdlg, 0);
     
  }
  return 0;
}


#pragma comment(linker, "/entry:myWinMain")
__declspec(naked) void __stdcall myWinMain()
{
  __asm {
    push    0
    call    dword ptr GetModuleHandle
    push    eax
    push    offset AppDlgProc
    push    0
    push    IDD_APP
    push    eax
    call    dword ptr DialogBoxParam
    push    0
    call    dword ptr ExitProcess
  }
}

ciao...
BruNews, MVP VC++
Messages postés
86
Date d'inscription
dimanche 8 janvier 2006
Statut
Membre
Dernière intervention
5 décembre 2010

Je ne fais pas le Hook avec une DLL, voici le code :

#define _WIN32_WINNT         0x0600
#define _WIN32_IE            0x0700

#include <windows.h>
#include <stdio.h>

...

__declspec(dllexport) LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam);

...

_declspec(dllexport) LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    if (nCode == HC_ACTION)
    {
        if(lParam > 0)
        {
            if (wParam == WM_KEYDOWN) // Touche appuyée
            {
                BYTE KeyState[256];
                WORD wBuf;
               
                KBDLLHOOKSTRUCT hookstruct = *((KBDLLHOOKSTRUCT*)lParam);
               
                GetKeyboardState(KeyState);
               
                ToAscii(hookstruct.vkCode, hookstruct.scanCode, KeyState, &wBuf, 0);
               
                switch(hookstruct.vkCode)
                {
                    case VK_SNAPSHOT :
                         ...
                         break;
                   
                    ...
                   
                    default :
                         break;
                }
            }
           
            else if (wParam == WM_KEYUP) // Touche Relachée
            {
                BYTE KeyState[256];
                WORD wBuf;
               
                KBDLLHOOKSTRUCT hookstruct = *((KBDLLHOOKSTRUCT*)lParam);
               
                GetKeyboardState(KeyState);
               
                ToAscii(hookstruct.vkCode, hookstruct.scanCode, KeyState, &wBuf, 0);
               
                switch(hookstruct.vkCode)
                {
                    case VK_SNAPSHOT :
                         ...
                         break;
                   
                    ...
                   
                    default :
                         break;
                }
            }
        }
    }
   
    return CallNextHookEx(hHook, nCode, wParam, lParam);
}

Et pour l'activer je fais seulement :
instance = GetModuleHandle(NULL);
SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC) HookProc, instance, NULL);
Puis pour le désactiver :
UnhookWindowsHookEx(hHook);
Tout marche avec ce code sauf la répétition de la touche ^ lorsque le Hook est activé.

Que pourrais-je essayer ? :/
Messages postés
86
Date d'inscription
dimanche 8 janvier 2006
Statut
Membre
Dernière intervention
5 décembre 2010

Je bloque toujours sur ce problème !

En plus à part ce beug j'ai entièrement fini mon logiciel ! ^^

Comment pourrais-je corriger cette anomalie de répétition de la touche ^ !?

Merci Beaucoup pour votre Aide ! ;)
Messages postés
86
Date d'inscription
dimanche 8 janvier 2006
Statut
Membre
Dernière intervention
5 décembre 2010

Personne n'a déjà eu ce problème ! ?