Page 1 sur 3

detecteur d'appui clavier

Publié : lun. 28/févr./2011 0:08
par Parole De JOJO
J'ai essaye de faire un petit code qui detecte les appuis se entree et espace et affiche le nombre d'appuis dans une petite fenetre
le probleme est que ca ne detecte que les appuis qui sont fait lorsque la fenetre cree a le focus, mais si une autre fenetre l'a, ca ne capte pas
un petit conseil?
merci :D :D


Code : Tout sélectionner

Enumeration
  #Window_0
  #Text_Enter
  #Text_Space
  #Text_Mail
  #String_Enter
  #String_Space
EndEnumeration
Procedure Open_Window_0()
  If OpenWindow(#Window_0, 0, 60, 126, 59, "ENTER",#PB_Window_Tool   |#PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
    If CreateGadgetList(WindowID(#Window_0))
      TextGadget(#Text_Enter, 80, 0, 30, 15, "ENTER")
      TextGadget(#Text_Space, 80, 25, 30, 15, "SPACE")
      TextGadget(#Text_Mail, 10, 40, 110, 20, "*******@gmail.com")
      StringGadget(#String_Enter, 10, 0, 35, 15, "", #PB_String_ReadOnly | #PB_String_BorderLess)
      StringGadget(#String_Space, 10, 25, 35, 15, "", #PB_String_ReadOnly | #PB_String_BorderLess)
    EndIf
  EndIf
EndProcedure
InitKeyboard()
InitSprite()
Open_Window_0()
OpenWindowedScreen(WindowID(#Window_0), 0, 0, 1, 1, 1, 0, 0)
StickyWindow(#Window_0,1)
Repeat
  Event=WaitWindowEvent()
  ExamineKeyboard()
  If KeyboardPushed(#PB_Key_Return)
    k+1
    Debug "Return = "+Str(k)
  EndIf
    If KeyboardPushed(#PB_Key_Space)
    l+1
    Debug "Space = "+Str(l)
  EndIf
Until Event = #PB_Event_CloseWindow 
End

Re: detecteur d'appui clavier

Publié : lun. 28/févr./2011 0:33
par falsam
Tu souhaites détecter la touche Entrée ou Espace depuis n'importe quelle application et le signaler à ta fenêtre ?

Re: detecteur d'appui clavier

Publié : lun. 28/févr./2011 5:50
par Parole De JOJO
humm je pense qu oui
en fait pas seullement d'une application, meme si aucune fenetre est ouverte et le gars s'amuse a taper entrer ou espace

Re: detecteur d'appui clavier

Publié : lun. 28/févr./2011 8:54
par falsam
En bref un keylogger :p

Tu va devoir passer par un Hook (Crochet ou Hameçon en anglais)

Windows génère un événement pour chaque action sur le matériel. Chaque fois qu'un utilisateur appuie sur une touche du clavier ou déplace la souris. Le système d'exploitation insère ces événements dans une file d'attente. Un hook est un moyen d'intercepter ces évènements de Windows.

les différentes API mises en oeuvre dans le cadre de la création d'un Hook.
SetWindowsHookEx :Cette API permet la mise en place d'un hook.

CallNextHookEx : Cette API permet de passer les informations du message en cours de traitement à la procédure suivante.

UnhookWindowsHookEx : Cette API permet de libérer le Hook.


lParam contient un pointeur vers la structure KBDLLHOOKSTRUCT

Code : Tout sélectionner

Structure KBDLLHOOKSTRUCT
  vkCode.i 
  scanCode.i 
  flags.i 
  Time.i 
  dwExtraInfo.i
EndStructure

;Procédure qui devra être appelée lorsque circulera un message de type "Clavier"
Procedure HookActionCallBack(nCode, wParam, lParam) 
  
*keyBoard.KBDLLHOOKSTRUCT=lParam

  Dim keyState.c (255)
  GetKeyboardState_(@KeyState())

  Debug *Keyboard\vkCode

  ProcedureReturn CallNextHookEx_(HookHandle, nCode, wParam, lParam)
EndProcedure

HookHandle=SetWindowsHookEx_(#WH_KEYBOARD_LL, @HookActionCallBack(), 0, 0)

OpenWindow(1, 10, 10, 10, 10, "", #PB_Window_SystemMenu)
StickyWindow(1, 1)

Repeat
 
Until WaitWindowEvent()=#PB_Event_CloseWindow

;On libére le Hook à l'aide de la fonction UnHookWindowsHookEx
UnhookWindowsHookEx_(HookHandle)
On constate que, lorsque j’appuie sur la touche ‘a’, mon keylogger me l’affiche 2 fois car le hook intercepte la touche enfoncée et la touche relevée.

Le code corrigé.

Code : Tout sélectionner

Structure KBDLLHOOKSTRUCT
  vkCode.i 
  scanCode.i 
  flags.i 
  Time.i 
  dwExtraInfo.i
EndStructure

;Procédure qui devra être appelée lorsque circulera un message de type "Clavier"
Procedure HookActionCallBack(nCode, wParam, lParam) 
  Protected *keyBoard.KBDLLHOOKSTRUCT=lParam
  Dim keyState.c (255)
  
  If (nCode=#HC_ACTION) And (wParam = #WM_KEYDOWN)
      GetKeyboardState_(@KeyState())
      Debug *Keyboard\vkCode
    EndIf
    
  ProcedureReturn CallNextHookEx_(HookHandle, nCode, wParam, lParam)
EndProcedure

HookHandle=SetWindowsHookEx_(#WH_KEYBOARD_LL, @HookActionCallBack(), 0, 0)

OpenWindow(1, 10, 10, 10, 10, "", #PB_Window_SystemMenu)
StickyWindow(1, 1)

Repeat
 
Until WaitWindowEvent()=#PB_Event_CloseWindow

;On libére le Hook à l'aide de la fonction UnHookWindowsHookEx
UnhookWindowsHookEx_(HookHandle)
Il n'est pas encore parfait, mais il répond largement à ta demande.

Re: detecteur d'appui clavier

Publié : lun. 28/févr./2011 9:36
par blendman
Si je peux me permettre, ce serait intéressant de donner le code pour un brouilleur de capture de touches de clavier aussi, ça permettrait d'avoir un outil pour contrer ce genre de chose quand ce n'est pas souhaité ;).

Re: detecteur d'appui clavier

Publié : lun. 28/févr./2011 10:14
par Backup
...................

Re: detecteur d'appui clavier

Publié : lun. 28/févr./2011 10:22
par falsam
ha mince !!! Je pensais que ça ne fonctionnait pas si la fenêtre n'avait plus le focus. Merci Dobro.
Dobro a écrit :(au passage le code ci dessus , ne marche pas chez moi)]
Quel version de windows as tu ?

Re: detecteur d'appui clavier

Publié : lun. 28/févr./2011 11:13
par Backup
falsam a écrit :
Dobro a écrit :(au passage le code ci dessus , ne marche pas chez moi)]
Quel version de windows as tu ?
XP SP3 +(pcTools +Antivir)

Re: detecteur d'appui clavier

Publié : lun. 28/févr./2011 12:43
par Parole De JOJO
Dobro Merci beaucoup c'est cool ce code :D :D
merci aussi a falsam, ton code m'a servi pour trouver le numero ASCII des touches :idea:

Re: detecteur d'appui clavier

Publié : lun. 28/févr./2011 12:50
par Ar-S
Parole De JOJO a écrit :Dobro Merci beaucoup c'est cool ce code :D :D
merci aussi a falsam, ton code m'a servi pour trouver le numero ASCII des touches :idea:
note:
Si tu utilises JaPBe, ALT+A fait apparaitre la table ASCII
tu peux ensuite copier le code hex, le car etc...

Re: detecteur d'appui clavier

Publié : lun. 28/févr./2011 13:02
par Parole De JOJO
En fait ourquoi le delay a la fin? il fait bugger la fenetre (elle met du temps a afficher les chiffres)
je l'ai diminue mais la les infos se faussent (il detecte un seul apui comme deux ou trois)

Code : Tout sélectionner

Enumeration
  #Window_0
  #Text_Enter
  #Text_Space
  #Text_Mail
  #String_Enter
  #String_Space
EndEnumeration
  If OpenWindow(#Window_0, 0, 60, 126, 59, "Entrex",#PB_Window_Tool   |#PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
      TextGadget(#Text_Enter, 10, 0, 30, 15, "Enter")
      TextGadget(#Text_Space, 10, 25, 30, 15, "Space")
      TextGadget(#Text_Mail, 10, 40, 110, 20, "******@gmail.com")
    StringGadget(#String_Enter, 65, 0, 50, 15, "0", #PB_String_ReadOnly)
    StringGadget(#String_Space, 65, 25, 45, 15, "0", #PB_String_ReadOnly)
  EndIf
StickyWindow(#Window_0,1)
Repeat
  Event = WaitWindowEvent (10)
  Select EventWindow ()
    Case #Window_0
      GetCursorPos_ (Pos.POINT)
      If  GetAsyncKeyState_ (13)
        k+1:SetGadgetText(#String_Enter,Str(k)):Beep_ (440,100)
      ElseIf  GetAsyncKeyState_ (32)
        l+1:SetGadgetText(#String_Space,Str(l)):Beep_ (540,100)
      EndIf
      Delay (80)
  EndSelect
Until Event = #PB_Event_CloseWindow 
End

Re: detecteur d'appui clavier

Publié : lun. 28/févr./2011 14:13
par Backup
ben vire le :roll:

Re: detecteur d'appui clavier

Publié : lun. 28/févr./2011 14:19
par Parole De JOJO
si je le vire il se deregle (il detecte un seul appui comme 2 ou 3)

Re: detecteur d'appui clavier

Publié : lun. 28/févr./2011 15:04
par Backup
.................

Re: detecteur d'appui clavier

Publié : lun. 28/févr./2011 15:18
par Parole De JOJO
Je suis deole dobro mais la je ne t'ais pas suivi