je mets le code ici : ça peut être utile pour voir comment mettre en place un hook, et j'en ai profité pour mettre en oeuvre un pipe.
la première partie à compiler comme DLL sous le nom "c:\hook.dll"
Code : Tout sélectionner
Global n,state.b,hhook,init
init=1
Procedure envoi()
WaitNamedPipe_("\\.\pipe\hookpipe", 3000)
Hpipe = CreateFile_("\\.\pipe\hookpipe", #GENERIC_READ |#GENERIC_WRITE, 0, #Null, #OPEN_EXISTING,0, #Null)
If Hpipe
If state
Buffer_Ecriture.s="Touche = chr("+Str(n)+") pressée"
Else
Buffer_Ecriture.s="Touche = chr("+Str(n)+") relachée"
EndIf
WriteFile_(Hpipe,@Buffer_Ecriture,Len(Buffer_Ecriture), @envoye, 0)
FlushFileBuffers_(Hpipe)
If init
Buffer_Lecture.s=Space(100)
ReadFile_(Hpipe, @Buffer_Lecture, Len(Buffer_Lecture), @recu, 0)
hhook=Val(Buffer_Lecture)
init=0
EndIf
EndIf
CloseHandle_(Hpipe)
EndProcedure
ProcedureDLL hook(ncode,wparam,lparam)
If ncode+1
n=wparam
state=1+lparam>>31
CreateThread(@envoi(),wparam)
EndIf
ProcedureReturn CallNextHookEx_(hhook,ncode,wparam,lparam)
EndProcedure
Code : Tout sélectionner
#PIPE_ACCES_DUPLEX=3
Global Buffer_Ecriture.s,Buffer_Lecture.s,init,hhook
Buffer_Ecriture=Space(100)
Buffer_Lecture=Space(100)
init=1
Procedure Thread_Client(pipe.l)
Repeat
fConnected = ConnectNamedPipe_(pipe, #Null)
If fConnected
ReadFile_(pipe, @Buffer_Lecture, Len(Buffer_Lecture), @recu, 0)
AddGadgetItem(0, 0, Buffer_Lecture)
If init
Buffer_Ecriture=Str(hhook)
WriteFile_(pipe,@Buffer_Ecriture,Len(Buffer_Ecriture), @envoye, 0)
FlushFileBuffers_(pipe)
init=0
EndIf
EndIf
DisconnectNamedPipe_(pipe)
ForEver
EndProcedure
lib.s="c:\hook.dll"
hmodule=LoadLibrary_(@lib)
proc.s="hook"
adresse=GetProcAddress_(hmodule,@proc)
If OpenWindow(0,0,0,600,200,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"Test hook") And CreateGadgetList(WindowID(0))
EditorGadget (0,10,10,580,160,#PB_Container_Raised)
Hpipe=CreateNamedPipe_("\\.\pipe\hookpipe", #PIPE_ACCES_DUPLEX, #PIPE_TYPE_MESSAGE | #PIPE_READMODE_MESSAGE, 1, 100, 100, 3000, 0)
If Hpipe
AddGadgetItem(0, 0,"serveur créé")
EndIf
hhook=SetWindowsHookEx_(#WH_KEYBOARD,adresse,hmodule,0)
If hhook
AddGadgetItem(0,0,"hook établi. hhook="+Str(hhook))
EndIf
Thread=CreateThread(@Thread_Client(),Hpipe)
Repeat
Event= WaitWindowEvent()
Select Event
Case #PB_Event_CloseWindow
KillThread(Thread)
CloseHandle_(Hpipe)
UnhookWindowsHookEx_(hhook)
Quit = 1
EndSelect
Until Quit = 1
EndIf
Ce sont des choses qui s'intercalent sur les canaux de communication et permettent de lire, et pour certains de modifier, les messages envoyés aux diverses fenêtres.
Ce qui est un peu contraignant pour la programmation, c'est qu'un hook global doit être dans une DLL (d'où le code précédent).