Connaitre tous les évènements de windows

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
olivier
Messages : 305
Inscription : mer. 05/janv./2005 12:58
Localisation : http://www.tib-net.com/meca/index.htm

Connaitre tous les évènements de windows

Message par olivier »

Salut à tous,

J'éspère que vous n'avez pas trop de boulot sous ce soleil !
Bon courage à tous ceux qui passent leur exam !

Voilà, je voudrais faire un enregistreur répéteur de tache !
Exemple, sur mon forum, un individu avait enregistrer 2000 membres, il m'a fallut les retirer. Pour cela j'ai créé un prog qui faisait clic, clic , clic...

Pour tout ce qui est action (clic sendkey,...) je sais faire....
Ce qui me pose problème est l'enregistrement des macros. J'aimerais que mon prog enregistre une succession d'evenement, mais je n'arrive pas à récupérer les évenements en dehors de la fenetre purebasic.

Merci d'avance pour toutes vos pistes.

Code : Tout sélectionner

Procedure recup_event(WindowID, Message, wParam, lParam)
   Resultat = #PB_ProcessPureBasicEvents
   ;
   Debug Str(WindowID)+" : "+Str(Message)+" : "+Str(wParam)+" : "+Str(lParam)
   ;
   ProcedureReturn Resultat
EndProcedure

OpenWindow(0,0,0,300,100,"",#PB_Window_SystemMenu)
 
SetWindowCallback(@recup_event())
Repeat 
   event=WindowEvent()
   Delay(10)
   GetCursorPos_(@re_save.point)
   SetWindowTitle(0,Str(re_save\X)+" : "+Str(re_save\y))
   
Until event=#WM_close
Vive le temps libre !
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

regarde le Tuto sur la souris !!

http://purebasic.forum-gratuit.com/viewtopic.php?t=1310
a la fin il y a un exemple de deplacement et de click !!
qui marche sur toutes les fenetres, je me suis servi d'une version legerement modifié a une epoque pour tricher sur les jeux Flash !!
(celui ou il faut ecrabouiller un max de souris a l'ecran avec un marteau !! :D )


(cela avait scandalisé le "bien pensant" , alors que je m'etais moi-meme denoncé !! :lol: m'adressant a des programeurs Purebasic , j'avais a l'epoque pensé que l'on me demanderai le source, et ben meme pas !! , je me suis fait incendié , et on m'a viré tout mes scores, meme ceux ou j'avais pas triché ! :lol: j'ai jamais remis les pieds sur ce site depuis !! )
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Tiens, je me souviens de ça!

Tu parles d'un scandale pour pas grand-chose :lol:
olivier
Messages : 305
Inscription : mer. 05/janv./2005 12:58
Localisation : http://www.tib-net.com/meca/index.htm

Message par olivier »

Merci pour ta réponse Dobro

Mais tout cela je l'ai déjà pompé :wink:

Ce que j'ai besoins, c'est DETECTER une série de clic sur une autre application.
Je m'explique, je lance mon prog d'enregistrement, puis je me remet sous ( par exemple) Mozilla. Je clic ici, je clic la........ J'arrette mon prog qui m'a créer un fichier avec toutes les positions ou j'ai cliqué.

J'ai donc besoins de détecter les clic dans une autre application ! Je parle de clic mais il y a aussi le clavier !

Pour l'instant je me sert d'une fentre transparente que je met par dessus mon application, mais cela n'est pas top.

Merci d'avance
Vive le temps libre !
olivier
Messages : 305
Inscription : mer. 05/janv./2005 12:58
Localisation : http://www.tib-net.com/meca/index.htm

Message par olivier »

Pour être plus claire je cherche une commande du style WaitwindowEvent, mais pour tous le system : WaitSystemEvent.....
Vive le temps libre !
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

et bien le c'est exactement ce que fait le tuto !!

il recupere le click, il recupere la coordonné de la souris, a toi de generer un fichier avec cela !! tu ecris la coordonnée au moment du click !!

le code ci dessous
enregistre le mouvement (donc les coordonées) !!

Code : Tout sélectionner

n=500

Dim Pos.POINT(n)

MessageRequester("CursorPos","Bougez la souris pdt quelques secondes")

For i=0 To n   
    GetCursorPos_(Pos(i))
    Delay(1)
Next

MessageRequester("CursorPos","Replay")

For i=0 To n   
    SetCursorPos_(Pos(i)\x,Pos(i)\y)
    Delay(1)
Next
a toi de les ecrire dans un fichier txt , a chaque click tu enregistre les coordonées !!

(l'exempl enregistre les coordonée dans un tableau !!)

tu fais la partie
qui lit ce fichier, et bouge la souris , et auto click !!

t'a tout ce qu'il te faut dans ce tuto regarde bien tout les listing
ça devrai pas etre trop dur en principe :D


REEDIT : ce programme n'a pas forcement besoin que tu ouvre une fenetre par dessus une application !!
ça recupere les coordonées, de la souris, elle s'en fout de ce qui se trouve dessous !! :D
olivier
Messages : 305
Inscription : mer. 05/janv./2005 12:58
Localisation : http://www.tib-net.com/meca/index.htm

Message par olivier »

Merci Beaucoup Dobro pour ton dévoument.....
Escuse moi je ne dois pas être clair.

Le mouvement de la souris pas de soucis ! (cf mon code du début)

Mais pour les clics, détecter quand l'utilisateur clique, là j'ai des problème ( si se n'est pas dans mon application).

Merci encore
Vive le temps libre !
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

ouchlala, c'est bcp plus compliqué comme demande çà.

tu as dis " si ce n'est pas dans mon application "...

tu veux quoi, 'tracer' / 'surveiller' une application en particulier ?
ou toutes les applications tournant sur le bureau ?

je crois savoir faire çà - pas sûr quand meme...
Image
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

un hook sur le clavier et la souris ?

Dri
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

ouai je vois que çà aussi - jamais essayé par contre.
Image
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

Voilà un ptit truc que j'avais utilisé il y a quelques temps. Ca permet de "lier" deux applications. Moi j'en avais besoin pour obliger une fenêtre récalcitrante d'un prog externe à passer devant. Je pense qu'il y a moyen d'en tirer quelque chose pour les événements aussi.

Code : Tout sélectionner

      thread1=GetWindowThreadProcessId_(GetForegroundWindow_(),0)
      thread2=GetWindowThreadProcessId_(nimportequelprog_hwnd,0)
      If thread1<>thread2 : AttachThreadInput_(thread1,thread2,#True) : EndIf
      SetForegroundWindow_(nimportequelprog_hwnd) : Sleep_(125) ; Delay to stop fast CPU issues.
      If thread1<>thread2 : AttachThreadInput_(thread1,thread2,#False) : EndIf 
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Dobro a écrit :regarde le Tuto sur la souris !!

http://purebasic.forum-gratuit.com/viewtopic.php?t=1310
a la fin il y a un exemple de deplacement et de click !!
qui marche sur toutes les fenetres, je me suis servi d'une version legerement modifié a une epoque pour tricher sur les jeux Flash !!
(celui ou il faut ecrabouiller un max de souris a l'ecran avec un marteau !! :D )

(cela avait scandalisé le "bien pensant" , alors que je m'etais moi-meme denoncé !! :lol: )

Pas de quoi fouetter un chat .... :D

L'idée était bonne
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

Géniale ta solution djes :D
Faut intercepter le message Activate pour changer de thread quand l'utilisateur change de fenêtre

Dri :10:
olivier
Messages : 305
Inscription : mer. 05/janv./2005 12:58
Localisation : http://www.tib-net.com/meca/index.htm

Message par olivier »

Merci à tous, ainsi qu'au forum anglais
.... j'entrevoie la solution, mais......

Je joind un premier post avec un code au plus simple pour résoudre mon problème. Et un deuxième poste avec le prog en l'état. Il n'est certe pas finis mais l'on peut commencer à entrevoir son utilisation.

Remarque : le prog est composé de deux parties, une à compiler en DLL (changer les options de compilation) et une autre normal.

Le problème qui reste : je n'arrive pas à passer correctement une chaine de caractère. Pour l'instant je pase le message par le presse papier (c'est pas tres jolie !) :?
Merci d'avance si vous avez une idée....concrete

DLL : HookDll.dll

Code : Tout sélectionner

ProcedureDLL HookMouse(code.l, wParam.l, lParam.l)
   
   *mymsg.MOUSEHOOKSTRUCT = lParam 
   *position.POINT=*mymsg\pt; MSG structure holds info

   Select wParam
      Case #WM_LBUTTONUP
         action$= "Clic G UP"
      Case #WM_LBUTTONDOWN
         action$= "Clic G Down"
      Case #WM_RBUTTONUP
         action$= "Clic D UP"
      Case #WM_RBUTTONDOWN
         action$= "Clic D Down"
      Default 
         action$=""
   EndSelect
   If action$<>""
         action$=LSet(action$,20)+LSet(Str(*position\x),10)+LSet(Str(*position\y),10)
      SetClipboardText(action$)
   EndIf
   
   ProcedureReturn CallNextHookEx_(@HookMouse(), code, wParam, lParam)
EndProcedure
Programme :

Code : Tout sélectionner

OpenWindow(0, 0, 0, 550, 160,"RecupEvent",  #PB_Window_SystemMenu)
StickyWindow(0,1)
hDLL = OpenLibrary(0, "HookDll.dll")
hmyHookMouse = SetWindowsHookEx_(#WH_MOUSE	, GetProcAddress_(hDLL, "HookMouse"), hDLL, 0)

Repeat
   Event=WindowEvent()
   Delay(10)
   mess$=GetClipboardText()
   If der_mess$<>mess$
      SetWindowTitle(0,mess$)
      der_mess$=mess$
   EndIf
   
Until Event=#wm_close

UnhookWindowsHookEx_(hmyHookMouse)
CloseLibrary(0)

End
Vive le temps libre !
olivier
Messages : 305
Inscription : mer. 05/janv./2005 12:58
Localisation : http://www.tib-net.com/meca/index.htm

Message par olivier »

Et le deuxième avec gestion du clavier :
Encore une fois cela n'est pas terminé et un processuss est mal terminé à certain moment....
DLL :

Code : Tout sélectionner

ProcedureDLL HookMouse(code.l, wParam.l, lParam.l)
   
   *mymsg.MOUSEHOOKSTRUCT = lParam 
   *position.POINT=*mymsg\pt; MSG structure holds info
   
   Select wParam
      Case #WM_LBUTTONUP
         action$= "Clic G UP"
      Case #WM_LBUTTONDOWN
         action$= "Clic G Down"
      Case #WM_RBUTTONUP
         action$= "Clic D UP"
      Case #WM_RBUTTONDOWN
         action$= "Clic D Down"
      Default 
         action$=""
   EndSelect
   If action$<>""
      action$=LSet(action$,20)+LSet(Str(*position\x),10)+LSet(Str(*position\y),10)
      SetClipboardText(action$)
   EndIf
   
   ProcedureReturn CallNextHookEx_(@HookMouse(), code, wParam, lParam)
EndProcedure


ProcedureDLL HookKeyboard(code.l, wParam.l, lParam.l)
   
   action$="Appuye touche"
   If lParam<0 : type$="UP" : Else : type$="DOWN" : EndIf
   action$=(LSet(action$,20)+LSet(Str(wParam),10)+LSet(type$,10))
   SetClipboardText(action$)
   ProcedureReturn CallNextHookEx_(@HookKeyboard(), code, wParam, lParam)
EndProcedure


Code : Tout sélectionner

;{- Variable
Global num_action,repertoire_execution$,quit
Global Dim action.s(1)
num_action=0
;}

Enumeration
   #fenetre_cpuremacro
   #cb_nom_macro
   #btn_execute_macro
   #strg_nv_macro
   #btn_save_macro
   
   #fenetre_choix_insert
   #btn_pause5
   #btn_pause10
   #btn_pause30
   #btn_pause
   #btn_attente_image
EndEnumeration

Procedure EnregistreFichierAction(NomFichier$="Macro_Test")
   fichier$=repertoire_execution$+"\Macro\"+NomFichier$+"\"+NomFichier$+".txt"
   MakeSureDirectoryPathExists_(fichier$)
   If  CreateFile(0,fichier$)
      For i = 1 To num_action-2 ;-2 pour retirer le clic pour agrandir la fenetre
         WriteStringN(0,action(i))
      Next
      CloseFile(0)
      RunProgram(fichier$)
      ProcedureReturn 1
   Else 
      MessageRequester("","impossible enregistrer action")
   EndIf
   
EndProcedure
Procedure EnregistreMacro()
   OpenWindow(0, 0, 0, 550, 160,"RecupEvent",  #PB_Window_SystemMenu)
   SetWindowState(0,#PB_Window_Minimize)
   
   SetClipboardText("")
   hDLL = OpenLibrary(0, "HookDll.dll")
   hmyHookMouse = SetWindowsHookEx_(#WH_MOUSE	, GetProcAddress_(hDLL, "HookMouse"), hDLL, 0)
   hmyHookHookKeyboard = SetWindowsHookEx_(#WH_KEYBOARD	, GetProcAddress_(hDLL, "HookKeyboard"), hDLL, 0)
   
   Repeat
      Event=WindowEvent()
      Delay(10)
      mess$=GetClipboardText()
      
      
      If der_mess$<>mess$
         If Trim(mess$)="Appuye touche       119       DOWN"
            OpenWindow(   #fenetre_choix_insert,0, 0, 210, 160,"RecupEvent", #PB_Window_ScreenCentered | #PB_Window_SystemMenu)
            StickyWindow(#fenetre_choix_insert,1)
            CreateGadgetList(WindowID(#fenetre_choix_insert))
            y=5
            ButtonGadget(#btn_pause,5,y,140,20,"Pause ? /10 sec")
            ButtonGadget(#btn_pause5,140,y,20,20,"5")
            ButtonGadget(#btn_pause10,160,y,20,20,"10")
            ButtonGadget(#btn_pause30,180,y,20,20,"30")
            y=y+22
            ButtonGadget(#btn_attente_image,5,y,140,20,"Attente d'une image")
            
            
            qui_insert=0
            Repeat 
               Event=WindowEvent()
               Select Event
                  Case #PB_Event_Gadget
                     Select EventGadget()
                        Case #btn_pause
                           pause$=InputRequester("Pause","La pause en /10ème de seconde","")
                           action$="Pause               "+pause$
                        Case #btn_pause5
                           action$="Pause               5"
                        Case #btn_pause10
                           action$="Pause               10"
                        Case #btn_pause30
                           action$="Pause               30"
                     EndSelect
                     qui_insert=1
                     num_action=num_action+1
                     Redim action.s(num_action)
                     action(num_action)=action$
               EndSelect
               
            Until qui_insert=1
            CloseWindow(#fenetre_choix_insert)
            mess$=GetClipboardText() :  der_mess$=mess$ ;permet de supprimer le UP du clic sur le boutton
         Else
            der_mess$=mess$
            num_action=num_action+1
            Redim action.s(num_action)
            action(num_action)=mess$
         EndIf 
      EndIf
      
      
   Until GetWindowState(0)<>#PB_Window_Minimize
   
   UnhookWindowsHookEx_(hmyHookMouse)
   UnhookWindowsHookEx_(hmyHookHookKeyboard)
   CloseLibrary(0)
   CloseWindow(0)
EndProcedure
Procedure RemplirListMacro()
   
   If ExamineDirectory(0, repertoire_execution$+"Macro\", "*.*")  
      While NextDirectoryEntry(0)
         If DirectoryEntryType(0) = #PB_DirectoryEntry_File
            type$ = " [Fichier] "
         Else
            If DirectoryEntryName(0)<>"." And DirectoryEntryName(0)<>".."
               AddGadgetItem(#cb_nom_macro,-1,DirectoryEntryName(0))
            EndIf
            
         EndIf
         
         ;Debug DirectoryEntryName(0) + type$ + "- Taille en octet : " + Str(DirectoryEntrySize(0))
      Wend
      FinishDirectory(0)
   EndIf
   SetGadgetState(#cb_nom_macro,0)
EndProcedure
Procedure LectureMacro(NomMacro$)
   
   fichier$=repertoire_execution$+"\Macro\"+NomMacro$+"\"+NomMacro$+".txt"
   ;MessageRequester("Debut Macro",fichier$)
   id_file=OpenFile(#PB_Any, fichier$)
   If id_file
      Repeat
         
         ligne$= ReadString(id_file)
         type$=Trim(Left(ligne$,20))
         Debug type$
         par1$=Trim(Mid(ligne$,20,10))
         par2$=Trim(Mid(ligne$,30,10))
         Debug par1$
         Debug par2$
         Select type$
            Case "Clic G Down"
               SetCursorPos_(Val( par1$),Val( par2$))
               mouse_event_(#MOUSEEVENTF_ABSOLUTE | #MOUSEEVENTF_LEFTDOWN, x,y,0,0)
            Case "Clic G UP"
               SetCursorPos_(Val( par1$),Val( par2$))
               mouse_event_(#MOUSEEVENTF_ABSOLUTE | #MOUSEEVENTF_LEFTUP, x,y,0,0)
            Case "Clic D Down"
               SetCursorPos_(Val( par1$),Val( par2$))
               mouse_event_(#MOUSEEVENTF_ABSOLUTE | #MOUSEEVENTF_RIGHTDOWN, x,y,0,0)
            Case "Clic D UP"
               SetCursorPos_(Val( par1$),Val( par2$))
               mouse_event_(#MOUSEEVENTF_ABSOLUTE | #MOUSEEVENTF_RIGHTUP, x,y,0,0)
            Case "Appuye touche"
               Select par2$
                  Case "DOWN"
                     Debug "downnnn"
                     keybd_event_(Val( par1$), 0,0,0)
                  Case "UP"
                     keybd_event_(Val( par1$), 0, #KEYEVENTF_KEYUP,0)
               EndSelect
         EndSelect
         Delay(100)
      Until Loc(id_file)=Lof(id_file)
      CloseFile(id_file)
   Else
      MessageRequester("Oups ! ","Impossible de lire cette macro"+Chr(10)+fichier$)
   EndIf
   
   
   
EndProcedure



;{- Définition de la fenetre principale
repertoire_execution$=GetCurrentDirectory()
OpenWindow(#fenetre_cpuremacro, 0, 0, 400, 80,"CpureMacro",  #PB_Window_SystemMenu)
CreateGadgetList(WindowID(0))
ComboBoxGadget(#cb_nom_macro,10,10,300,200)
ButtonGadget(#btn_execute_macro,320,10,60,20,"Lancer")
StringGadget(#strg_nv_macro,10,40,300,20,"Test")
ButtonGadget(#btn_save_macro,320,40,60,20,"Enregistrer")
RemplirListMacro()
;}

Repeat
   Event=WaitWindowEvent()
   Select Event
      Case #PB_Event_Gadget
         Select EventGadget()
            Case #btn_save_macro ;{ Enregistrement de la macro
               nom_macro$=GetGadgetText(#strg_nv_macro)
               If nom_macro$=""
                  MessageRequester("Oups","Vous n'avez pas mis de nom de macro !")
               Else
                  If FileSize("Macro\"+nom_macro$)<>-1 And nom_macro$<>"Test"
                     resu=MessageRequester("Oups","La macro existe déjà. L'éffacer ?",#PB_MessageRequester_YesNo )
                     If resu=6
                        save=1
                     Else
                        save=0
                     EndIf
                     
                     
                  Else
                     save=1
                  EndIf
                  If save=1
                     CloseWindow(#fenetre_cpuremacro)
                     
                     EnregistreMacro()
                     EnregistreFichierAction(nom_macro$)
                  EndIf
               EndIf
               ;}
            Case #btn_execute_macro ;{Lecture macro
               NomMacro$=GetGadgetText(#cb_nom_macro)
               SetWindowState(#fenetre_cpuremacro,#PB_Window_Minimize)
               thread=CreateThread(@LectureMacro(),@NomMacro$)
               WaitThread(thread)
               quit=1
               
         EndSelect
      Case #wm_close
         quit=1
   EndSelect
Until quit=1
End
Vive le temps libre !
Répondre