T103
Messages postés177Date d'inscriptionlundi 11 août 2003StatutMembreDernière intervention21 avril 2010
-
27 nov. 2006 à 17:53
T103
Messages postés177Date d'inscriptionlundi 11 août 2003StatutMembreDernière intervention21 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.