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
Z@ph0d//