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

cs_lol55 Messages postés 86 Date d'inscription dimanche 8 janvier 2006 Statut Membre Dernière intervention 5 décembre 2010 - 12 juil. 2007 à 10:52
cs_lol55 Messages postés 86 Date d'inscription dimanche 8 janvier 2006 Statut Membre Dernière intervention 5 décembre 2010 - 3 août 2007 à 23:12
    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

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
12 juil. 2007 à 11:46
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++
0
cs_lol55 Messages postés 86 Date d'inscription dimanche 8 janvier 2006 Statut Membre Dernière intervention 5 décembre 2010
12 juil. 2007 à 12:37
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 ? :/
0
cs_lol55 Messages postés 86 Date d'inscription dimanche 8 janvier 2006 Statut Membre Dernière intervention 5 décembre 2010
15 juil. 2007 à 02:20
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 ! ;)
0
cs_lol55 Messages postés 86 Date d'inscription dimanche 8 janvier 2006 Statut Membre Dernière intervention 5 décembre 2010
3 août 2007 à 23:12
Personne n'a déjà eu ce problème ! ?
0
Rejoignez-nous