Page 1 sur 1

reconfiguration clavier

Publié : mar. 06/juil./2004 20:23
par hardy
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"

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


et a exécuter

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

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.