reconfiguration clavier
Publié : mar. 06/juil./2004 20:23
suite du sujet précédent
En utilisant un autre type de hook, on peut changer la configuration du clavier en modifiant les messages :
A compiler comme DLL sous le nom "c:\hook2.dll"
et a exécuter
sur mon ordinateur, la touche "a" donne les codes 4161 et 167
la touche "b" donne les codes 12354 et 48.
Ainsi avec cela, lorsque j'appuie sur la touche "a", ça fait un "b".
mais ces codes ne sont ni les scancodes, ni les codes virtuels.
Pour tester, il faut regarder les codes produits par les touches, et modifier les lignes adéquates dans le code.
Avec cette base, on peut faire avec un peu de travail un utilitaire de reconfiguration de clavier.
En utilisant un autre type de hook, on peut changer la configuration du clavier en modifiant les messages :
A compiler comme DLL sous le nom "c:\hook2.dll"
Code : Tout sélectionner
Global state.b,hhook,init,m.EVENTMSG
init=1
Procedure envoi()
WaitNamedPipe_("\\.\pipe\hookpipe2", 3000)
Hpipe = CreateFile_("\\.\pipe\hookpipe2", #GENERIC_READ |#GENERIC_WRITE, 0, #Null, #OPEN_EXISTING,0, #Null)
If Hpipe
Buffer_Ecriture.s=Str(m\message)+" "+Str(m\paramL)+" "+Str(m\paramH)
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
CopyMemory(lparam,@m,SizeOf(EVENTMSG))
If m\message=#WM_KEYDOWN Or m\message=#WM_KEYUP
CreateThread(@envoi(),0)
; ---------- à modifier selon tests -------------
If m\paramL=4161
m\paramL=12354
m\paramH=48
CopyMemory(@m,lparam,SizeOf(EVENTMSG))
EndIf
; --------------------------
EndIf
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:\hook2.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\hookpipe2", #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_JOURNALRECORD,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
la touche "b" donne les codes 12354 et 48.
Ainsi avec cela, lorsque j'appuie sur la touche "a", ça fait un "b".
mais ces codes ne sont ni les scancodes, ni les codes virtuels.
Pour tester, il faut regarder les codes produits par les touches, et modifier les lignes adéquates dans le code.
Avec cette base, on peut faire avec un peu de travail un utilitaire de reconfiguration de clavier.