Hook clavier

Résolu
T103 Messages postés 177 Date d'inscription lundi 11 août 2003 Statut Membre Dernière intervention 21 avril 2010 - 27 nov. 2006 à 17:53
T103 Messages postés 177 Date d'inscription lundi 11 août 2003 Statut Membre Dernière intervention 21 avril 2010 - 27 nov. 2006 à 18:23
Bonsoir a tous, voila j'essaye de comprendre le fonctionnement des hooks, jai trouver plusieurs source sur le net pour apprendre a recupérer les touches du clavier.
Je vais vous montrer le code source de ma DLL, mon programme compte juste le nbr de fois ou j'appui sur la touche entrée, mais le problème cest qu'il me compte 1 fois quand j'appui et 1 fois encore quand la touche est relachée. Comment faut il fair pour que le programme ne puisse compter que lorsque la touche est appuyée ? Merci pour vos conseils et aide, je vous donne la source de la DLL :

library dll;

uses
  SysUtils,
  Windows,
  Messages;

type
  TDonnees= record
     keybdHookHandle:HHook; {Handle du Hook retourné par SetWindowsHookEx}
     hDestWindow : HWND; // Handle de la fenêtre à laquelle le hook du clavier doit les données
  end;
  PDonnees = ^TDonnees;

  const
  WMAP_KEYBDHOOKMSG = WM_APP+1 ;

var
   memPartagee : Cardinal;//Handle de la zone de mémoire partagée
   VueDonnees : PDonnees;//Pointeur vers la zone de mémoire

function HookActionCallBack(nCode: integer; Wparam : WPARAM; Lparam: LPARAM):integer; stdcall;
{cette fonction reçoit tous les messages détournés                                            }
{elle envoit en retour un message avec les renseignements vers la fenêtre de handle HandleDest}
begin
  if (wParam = VK_RETURN) then
    PostMessage(VueDonnees^.hDestWindow, WMAP_KEYBDHOOKMSG, 0, 0);
  Result:=CallNextHookEx(VueDonnees^.keybdHookHandle,nCode,Wparam,Lparam);
end;

procedure InitHook(hDest:HWND)stdcall; export;
{SetWindowsHookEx permet de donner à windows le nom de la fonction qui sera }
{exécutée à chaque fois qu'il reçoit un message de type WH_KEYBOARD            }
begin
  if (VueDonnees^.keybdHookHandle=0) and (hDest<>0) then begin
    VueDonnees^.keybdHookHandle:=SetWindowsHookEx(WH_KEYBOARD,HookActionCallBack,HInstance,0);
    VueDonnees^.hDestWindow := hDest;
  end;
end;

procedure EndHook() stdcall; export;
begin
  if VueDonnees^.keybdHookHandle<>0 then begin
    UnhookWindowsHookEx(VueDonnees.keybdHookHandle);
    VueDonnees^.keybdHookHandle :=0;
  end;
end;

procedure LibraryProc(AReason:Integer)stdcall;export;
begin
  case AReason of
    DLL_PROCESS_ATTACH:begin
      {Il faut d'abord créer le FileMapping}
      {le $FFFFFFFF indique seulement que ce n'est pas un fichier qui sera mappé, mais des données}
      {TDonneesHook.InstanceSize permet de donner à Windows la bonne taille de mémoire à réserver}
      memPartagee:=CreateFileMapping($FFFFFFFF,nil,PAGE_READWRITE,0,sizeof(TDonnees),'Exile');
      {Ensuite faire un View sur tout le fichier}
      VueDonnees:=MapViewOfFile(memPartagee,FILE_MAP_WRITE,0,0,0);
    end;
    DLL_PROCESS_DETACH:begin //libérer les ressources prisent par notre FileMapping
      UnMapViewOfFile(VueDonnees);
      CloseHandle(memPartagee);
    end;
    DLL_THREAD_ATTACH:;
    DLL_THREAD_DETACH:;
  end;
end;

exports
  InitHook,
  EndHook;

begin
  DllProc:=@LibraryProc;
  LibraryProc(DLL_PROCESS_ATTACH);
end.

1 réponse

T103 Messages postés 177 Date d'inscription lundi 11 août 2003 Statut Membre Dernière intervention 21 avril 2010
27 nov. 2006 à 18:23
Yes merci beaucoup, avec sa je vais pouvoir me debrouiller :), merci encore et bonne soirée
0