mouse recorder

Programmation d'applications complexes
zaphod
Messages : 135
Inscription : dim. 07/déc./2008 9:32

mouse recorder

Message par zaphod »

Salut,

Il y a quelques années j'ai fait un programme (automat) très (très) diffusé, qui enregistre (et restitue) les actions à la souris et au clavier.
Codé en delphi.
Il ne fonctionne pas sous vista car la fonction SetWindowsHookEx n'est pas supportée sur cet os (je crois).
Et j'ai tous les jours des demandes pour le porter sous vista.

J'en ai fait un en pb qui enregistre les actions de la souris uniquement.
On peut ouvrir l'explorateur et lancer une appli par exemple.
Attention ne gère pas la molette de la souris.
la constante #MOUSEEVENTF_WHEEL n'est pas dispo en pb.

C'est une version 1.0 pas finalisée mais qui marche sous xp et vista.

On lance l'enregistrement avec start.
On arrête avec stop ou la touche Pause du clavier.
On lance la lecture de l'enregistrement avec play.
On peut sauver et charger les enregistrements.
On peut régler la mémoire allouée à l'enregistrement.

Le hook est inspiré de bouts de codes de Fluid Byte que j'ai vu passer sur le forum us.

Je vais voir si je poursuis le dev et si le diffuse comme automat.

Si ca peut servir, je met le source ici :

Code : Tout sélectionner

;mouse recorder 1.0
;by Z@phod - 2009 - http://landzone.free.fr
;
;
Enumeration
  #Window_0
EndEnumeration
;}
;{ Menu bars
Enumeration
  #Menu_Window_0
EndEnumeration
;}
;{ Menu/Toolbar items
Enumeration
  #Menu_Window_0_Open
  #Menu_Window_0_Save
  #Menu_Window_0_Exit
  #Menu_Window_0_Infos
EndEnumeration
;}
;{ Status bars
Enumeration
  #StatusBar_Window_0
EndEnumeration
;}
;{ Gadgets
Enumeration
 #Text_1
  #Button_start
  #Button_stop
  #Button_play
  #ProgressBar_5
  #String_6
  #CheckBox_7
  #Text_10
EndEnumeration
Define.l Event, EventWindow, EventGadget, EventType, EventMenu
;}
Global *memid.l,pos.l, hhkLLMouse.l, hhkllkey.l


Structure KBDLLHOOKSTRUCT 
   vkCode.l 
   scanCode.l 
   flags.l 
   time.l 
   dwExtraInfo.l 
EndStructure 

Procedure stoprecord()
If hhkllmouse<>0
      UnhookWindowsHookEx_(hhkLLMouse)
      UnhookWindowsHookEx_(hhkLLKey)
      hhkllmouse=0
      hhkllkey=0
      If GetGadgetState(#checkbox_7)=1
      HideWindow(#window_0,0)
      EndIf
      SetGadgetState(#progressbar_5,0)
EndIf
EndProcedure

Procedure keyHook(nCode.l,wParam.l,lParam.l) 
   *kbhk.KBDLLHOOKSTRUCT = lParam 
             
      If *kbhk\vkCode = #VK_PAUSE
      stoprecord()
      EndIf  
  ProcedureReturn CallNextHookEx_(0,nCode,wParam,lParam) 
EndProcedure 

Procedure MouseHook(nCode.l,wParam.l,lParam.l) 
   Protected p.point,but.w
   ;
   GetCursorPos_(p)
   If pos+6<MemorySize(*memid)
   PokeW(*memid+pos,p\x)
   pos+2
   PokeW(*memid+pos,p\y)
   pos+2
   PokeW(*memid+pos,wparam)
   pos+2
   ;
   SetGadgetState(#progressbar_5,pos)
   Else
   stoprecord()
   EndIf
   ;
   ProcedureReturn CallNextHookEx_(0,nCode,wParam,lParam) 
EndProcedure 

Procedure play()
For j=0 To pos-6 Step 6
x=PeekW(*memid+j)
y=PeekW(*memid+j+2)
b=PeekW(*memid+j+4)
;
If b=#WM_LBUTTONDOWN
mouse_event_(#MOUSEEVENTF_ABSOLUTE |	#MOUSEEVENTF_LEFTDOWN,x,y,0,0)
EndIf
If b=#WM_LBUTTONUP
mouse_event_(#MOUSEEVENTF_ABSOLUTE	| #MOUSEEVENTF_LEFTUP,x,y,0,0)
EndIf
If b=#WM_RBUTTONDOWN
mouse_event_(#MOUSEEVENTF_ABSOLUTE |	#MOUSEEVENTF_RIGHTDOWN,x,y,0,0)
EndIf
If b=#WM_RBUTTONUP
mouse_event_(#MOUSEEVENTF_ABSOLUTE	| #MOUSEEVENTF_RIGHTUP,x,y,0,0)
EndIf
If b=#WM_MBUTTONDOWN
mouse_event_(#MOUSEEVENTF_ABSOLUTE |	#MOUSEEVENTF_MIDDLEDOWN,x,y,0,0)
EndIf
If b=#WM_MBUTTONUP
mouse_event_(#MOUSEEVENTF_ABSOLUTE	| #MOUSEEVENTF_MIDDLEUP,x,y,0,0)
EndIf
;If b=#WM_MOUSEWHEEL
;mouse_event_(#MOUSEEVENTF_ABSOLUTE	| #MOUSEEVENTF_WHEEL,x,y,0,0)
;EndIf
;
SetCursorPos_(x,y)
;
SetGadgetState(#progressbar_5,j)
;
If GetAsyncKeyState_(#VK_PAUSE)=-32767 
 Break
EndIf 
;
WindowEvent()
;
Delay(10)
Next j
;
If GetGadgetState(#checkbox_7)=1
      HideWindow(#window_0,0)
      EndIf
SetGadgetState(#progressbar_5,0)
EndProcedure


Procedure OpenWindow_Window_0()
     If OpenWindow(#Window_0, 357, 290, 226, 171, "Mouse Recorder", #PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_TitleBar|#PB_Window_ScreenCentered)
 If CreateMenu(#Menu_Window_0, WindowID(#Window_0))
      MenuTitle("&File")
      MenuItem(#Menu_Window_0_Open, "&Open")
      MenuItem(#Menu_Window_0_Save, "&Save")
      MenuBar()
      MenuItem(#Menu_Window_0_Exit, "&Exit")
      MenuTitle("&?")
      MenuItem(#Menu_Window_0_Infos, "&Infos")
    EndIf
   If CreateStatusBar(#StatusBar_Window_0, WindowID(#Window_0))
      AddStatusBarField(150)
      StatusBarText(#StatusBar_Window_0, 0, "", #PB_StatusBar_Center)
    EndIf
    TextGadget(#Text_1, 10, 10, 50, 20, "Memory :", #PB_Text_Border|#PB_Text_Center)
    ButtonGadget(#Button_start, 10, 65, 55, 25, "start")
    ButtonGadget(#Button_stop, 85, 65, 45, 25, "stop")
    ButtonGadget(#Button_play, 170, 65, 50, 25, "play")
    ProgressBarGadget(#ProgressBar_5, 10, 35, 210, 20, 0, 100, #PB_ProgressBar_Smooth)
    StringGadget(#String_6, 65, 10, 65, 20, "10000")
    CheckBoxGadget(#CheckBox_7, 10, 105, 90, 15, "Hide Window")
    TextGadget(#Text_10, 135, 10, 40, 20, "bytes")
  EndIf
EndProcedure

;//////////////////////////////////
OpenWindow_Window_0()
;AddKeyboardShortcut(#window_0,#PB_Shortcut_Pause, 15)
StickyWindow(#window_0,1) 
;///////////////////////////////
 
;{- Event loop
Repeat
  Event = WaitWindowEvent()
  Select Event
    ; ///////////////////
    Case #PB_Event_Gadget
      EventGadget = EventGadget()
      EventType = EventType()
      ;
      If EventGadget = #Button_start
      If hhkllmouse=0
      pos=0
      If *memid<>0 
      FreeMemory(*memid)
      EndIf
      ;
      m=Val(GetGadgetText(#string_6))
      *memid=AllocateMemory(m)
      SetGadgetAttribute(#progressbar_5,#PB_ProgressBar_Maximum,m)
      If GetGadgetState(#checkbox_7)=1
      HideWindow(#window_0,1)
      EndIf
      ;
      hhkLLMouse = SetWindowsHookEx_(#WH_MOUSE_LL,@MouseHook(),GetModuleHandle_(0),0)
      hhkLLKey = SetWindowsHookEx_(#WH_KEYBOARD_LL,@keyHook(),GetModuleHandle_(0),0)
      EndIf
      ElseIf EventGadget = #Button_stop
      stoprecord()      
      ;
      ElseIf EventGadget = #Button_play
      If hhkllmouse=0 And pos>0
      SetGadgetAttribute(#progressbar_5,#PB_ProgressBar_Maximum,pos)
      If GetGadgetState(#checkbox_7)=1
      HideWindow(#window_0,1)
      EndIf
      play()
      EndIf
      EndIf
    ; ////////////////////////
     Case #PB_Event_Menu
    menu=EventMenu()
    If menu=#Menu_Window_0_Exit
    CloseWindow(#Window_0)
        Break
    ElseIf menu=#Menu_Window_0_Infos
    mes$="Mouse Recorder 1.0"
    mes$+#CRLF$+"by Zaphod @2009"
    mes$+#CRLF$+"http://landzone.free.fr"
    MessageRequester("Infos",mes$,#MB_ICONINFORMATION)
    ElseIf menu=#Menu_Window_0_Save
    If *memid<>0 
    Defaut$ = GetPathPart(ProgramFilename())+"mouserec.rec"   
    Filtre$ = "Mouse record (*.rec)|*.rec|All files (*.*)|*.*"
    Filtre = 0    
    Fichier$ = SaveFileRequester("Save file", Defaut$, Filtre$, Filtre)
    If fichier$
    If CreateFile(0, fichier$)
      WriteData(0, *memid,pos) 
    CloseFile(0) 
    Else
    MessageRequester("Error","Error writing file !",#MB_ICONERROR)
    EndIf
    EndIf
    EndIf
    ElseIf menu=#Menu_Window_0_Open
    Defaut$ = GetPathPart(ProgramFilename())   
    Filtre$ = "Mouse record (*.rec)|*.rec|All files (*.*)|*.*"
    Filtre = 0    
    Fichier$ = OpenFileRequester("Open file", Defaut$, Filtre$, Filtre)
    If fichier$
    If OpenFile(0, fichier$)
    If *memid<>0
    FreeMemory(*memid)
    EndIf
    pos = Lof(0)
      *MemID = AllocateMemory(pos)
      If *MemID
      ReadData(0, *memid,pos) 
      EndIf   
    CloseFile(0) 
    StatusBarText(#StatusBar_Window_0, 0, GetFilePart(fichier$), #PB_StatusBar_Center)
    EndIf
    EndIf
    ;
    ;ElseIf menu=15 
    ;stoprecord()
    EndIf
    ;/////////////////////////
    Case #PB_Event_CloseWindow
      EventWindow = EventWindow()
      If EventWindow = #Window_0
        CloseWindow(#Window_0)
        Break
      EndIf
  EndSelect
ForEver
;
;}
If *memid<>0
FreeMemory(*memid)
EndIf
;
If hhkllmouse<>0 
UnhookWindowsHookEx_(hhkLLMouse)
EndIf
If hhkllkey<>0
UnhookWindowsHookEx_(hhkLLKey)
EndIf
Voila,
Z@ph0d//
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

dans les tutos section débutant, un code similaire avait ete posté , il y a ........pffff ... tres longtemps :)

mais c'est cool de partager .. :)
Répondre