Simuler les évènements souris

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Oliv
Messages : 2117
Inscription : mer. 21/janv./2004 18:39

Simuler les évènements souris

Message par Oliv »

Suite à la discution avec Dobro, voici un code (puisil y aura une librairie) qui permet de simuler le déplacement et les clicks souris. L'annimation fournie fait démarrer => arrêter => annuler sur un PC avec un menu démarrer style XP, résolution 1024*768, barre des taches en bas (si ce n'est pas pareil chez vous ça marche quand même :P ).
Pour savoir quels coordonnées mettre, on peut utiliser ce code :

Code : Tout sélectionner

lpPoint.point 
Repeat 
  GetCursorPos_(lpPoint) 
  Debug "X = " + Str(lpPoint\X) 
  Debug "Y = " + Str(lpPoint\Y) 
  Debug "" 
  Delay(50) 
ForEver 
Et pour le code de simulation:

Code : Tout sélectionner

#D_Bas = 0 : #D_Haut = 1 : #D_Click = 2 : #D_DoubleClick = 3 ; bouton de droite
#G_Bas = 4 : #G_Haut = 5 : #G_Click = 6 : #G_DoubleClick = 8 ; Bouton de gauche
#M_Bas = 9 : #M_Haut = 10 : #M_Click = 11 : #M_DoubleClick = 12 ; bouton du milieu

Procedure MouseEvent(Ereignis.l) 
  Mem.l=GlobalAlloc_(0,8) 
  GetCursorPos_(Mem) 
  mouse_event_(Ereignis | $8000,PeekL(Mem)*($FFFF/GetSystemMetrics_(0)),PeekL(Mem+4)*($FFFF/GetSystemMetrics_(1)),0,GetMessageExtraInfo_()) 
  GlobalFree_(Mem) 
EndProcedure 

Procedure MouseClick(Option.b)
  Select Option
    Case #G_Bas
      MouseEvent($2)
    Case #G_Haut
      MouseEvent($4)
    Case #G_Click
      MouseEvent($2)
      MouseEvent($4)
    Case #G_DoubleClick
      MouseEvent($2) 
      MouseEvent($4)
      MouseEvent($2) 
      MouseEvent($4)
      
    Case #D_Bas
      MouseEvent($8)
    Case #D_Haut
      MouseEvent($10)
    Case #D_Click
      MouseEvent($8) 
      MouseEvent($10)
    Case #D_DoubleClick
      MouseEvent($8) 
      MouseEvent($10)
      MouseEvent($8) 
      MouseEvent($10)
      
    Case #M_Bas
      MouseEvent($20)
    Case #M_Haut
      MouseEvent($40)
    Case #M_Click
      MouseEvent($20) 
      MouseEvent($40)
    Case #M_DoubleClick
      MouseEvent($20) 
      MouseEvent($40)
      MouseEvent($20) 
      MouseEvent($40)
  EndSelect
EndProcedure

Procedure MouseMove(DX.l,DY.l,AX.l,AY.l,VX.l,VY.l,Delay.l)
; Arguments : Depart X -  Depart Y - Arrivée X - Arrivée Y - Vitesse X - Vitesse Y - Temps d'attente entre deux boucles)
  If DX - AX > 0 ; Si on va vers la gauche
    SensX = 1
  EndIf
  If DY- AY > 0 ; Si on va vers le haut
    SensY = 1
  EndIf
  Repeat
    If SensX = 1
      If DX > AX
        DX - VX
      Else
        DX = AX
      EndIf
    Else
      If DX < AX
        DX + VX
      Else
        DX = AX
      EndIf
    EndIf
    If SensY = 1
      If DY > AY
        DY - VY
      Else
        DY = AY
      EndIf
    Else
      If DY < AY
        DY + VY
      Else
        DY = AY
      EndIf
    EndIf
    SetCursorPos_(DX,DY)
    If DX = AX And DY = AY : Break : EndIf
    Delay(Delay)
  ForEver
EndProcedure

SetCursorPos_(10,760) ; Place le curseur sur démarrer
MouseClick(#G_Click)
MouseMove(10,760,310,710,5,1,20)
MouseClick(#G_Click)
MouseMove(310,710,650,372,5,5,20)
MouseClick(#G_Click)
Dernière modification par Oliv le lun. 09/août/2004 10:19, modifié 2 fois.
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

amusant :D
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

rajoute une petite procedure qui renvoi la coordone ACTUEL du pointeur
de cette facon on pourra voir la souris aller de l'endroit ou elle se trouve a l'endroit programé !!
un peut comme ça !!

Code : Tout sélectionner

 
    GetCursorPos_(CursorPos.POINT)
    MouseX = CursorPos\x
    MouseY = CursorPos\y
    
MouseMove( MouseX,MouseY,10,760,5,1,10)
j'ai pas compris dedans tu dit
Arguments : Depart X - Depart Y - Arrivée X - Arrivée Y - Vitesse X -
et pourtants les arguments on l'air d'etre imbrique !! ?????

Code : Tout sélectionner

 MouseMove(dx.l,AX.l,dy.l,AY.l,VX.l,VY.l,Delay.l)

dans ça moi je comprend
dx =depar_x
AX =arrivee_x
dy=depart_y
AY=arrivee_y
????????????????



l'ai de rien cela peut etre tres util au handicapé !!

tu met cett fonction accessible sur l'un des bouton de la souris
et lorsque la personne clique ! hop cela lance la fonction preprogramé !!

(purée j'ai de trop bonnes ideés moAaaaa !! )
:lol:
Oliv
Messages : 2117
Inscription : mer. 21/janv./2004 18:39

Message par Oliv »

elle sont peut-être bonnes mais incompréhensibles :wink:
rajoute une petite procedure qui renvoi la coordone ACTUEL du pointeur
ça je comprends moyenement, tu veux la renvoyer dans un code ou l'afficher à l'écran ?
de cette facon on pourra voir la souris aller de l'endroit ou elle se trouve a l'endroit programé !!
Tu ne la voit pas se déplacer toi ????
tu met cett fonction accessible sur l'un des bouton de la souris
et lorsque la personne clique ! hop cela lance la fonction preprogramé !!
Tu veux dire si quelqu'un clique, on envoi une certaine série de clicks ?
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

Citation:
rajoute une petite procedure qui renvoi la coordone ACTUEL du pointeur

ça je comprends moyenement, tu veux la renvoyer dans un code ou l'afficher à l'écran ?
je t'avai mis un exemple tres clair pourtant !!
le revoici :

Code : Tout sélectionner

  
    GetCursorPos_(CursorPos.POINT)
    MouseX = CursorPos\x
    MouseY = CursorPos\y
   
MouseMove( MouseX,MouseY,10,760,5,1,10)





Citation:
de cette facon on pourra voir la souris aller de l'endroit ou elle se trouve a l'endroit programé !!
Tu ne la voit pas se déplacer toi ????
ben ton "SetCursorPos_(10,760) " met le curseur directement a la position 10,760 !!!!! et la franchement j'ai de tres bon yeux mais je la vois vraiment pas aller de la position ou ma souris se trouve au moment de lancer le programme, a la position 10,760 !!!
c'est cela que je demande plus haut !!!
pas que la souris soit deplacé brutalement a la position 10,760
mais que progressivement elle parte de l'endroit ou elle se trouve pour aller en 10,760 !! you endaire stande ??? nao ?? :D





Citation:
tu met cett fonction accessible sur l'un des bouton de la souris
et lorsque la personne clique ! hop cela lance la fonction preprogramé !!

Tu veux dire si quelqu'un clique, on envoi une certaine série de clicks ?
non mettre un deplacement programé sur le bouton gauche
et un autre sur le bouton du millieu par exemple

le gars clic avec le bouton du millieu et a chaque clique cela fait monter le curseur d'un certain nombre de pixel !!
et le bouton droit ferai descendre le pointeur d'autant !!

mais cela peut etre pour aller a gauche ou a droite !!
suivant le manque de mobilité de la personne handicapé ! :)



tu m'explique la !!
j'ai pas compris dedans tu dit
Citation:
Arguments : Depart X - Depart Y - Arrivée X - Arrivée Y - Vitesse X -

et pourtants les arguments on l'air d'etre imbrique !! ?????

Code:
MouseMove(dx.l,AX.l,dy.l,AY.l,VX.l,VY.l,Delay.l)

dans ça moi je comprend
dx =depar_x
AX =arrivee_x
dy=depart_y
AY=arrivee_y
????????????????
Oliv
Messages : 2117
Inscription : mer. 21/janv./2004 18:39

Message par Oliv »

Quand je t'ai répondu, je ne voyais pas tout, j'avais justeune partie du message 8O 8O . Sinon j'aurais compris mais avec 1/4 du message (quasiment out mis en citations) je pouvais pas.

Pour le rajout de la fonction je pensais que chaqun le ferai mais tu as raison je le ferrai.

Code : Tout sélectionner

Procedure MouseMove(DX.l,AX.l,DY.l,AY.l,VX.l,VY.l,Delay.l)
; Arguments : Depart X - Depart Y - Arrivée X - Arrivée Y - Vitesse X - Vitesse Y - Temps en deux boucles)
C'est effectivement l'explication des paramètres, car j'ai pensé que DX et autres n'étaient pas parlants, et c'est vrai que je me suis planté, je corrige tout de suite en ça, merci :D

Code : Tout sélectionner

Procedure MouseMove(DX.l,AX.l,DY.l,AY.l,VX.l,VY.l,Delay.l)
; Arguments : Depart X -  Arrivée X - Depart Y - Arrivée Y - Vitesse X - Vitesse Y - Temps en deux boucles)
non mettre un deplacement programé sur le bouton gauche
et un autre sur le bouton du millieu par exemple

le gars clic avec le bouton du millieu et a chaque clique cela fait monter le curseur d'un certain nombre de pixel !!
et le bouton droit ferai descendre le pointeur d'autant !!

mais cela peut etre pour aller a gauche ou a droite !!
suivant le manque de mobilité de la personne handicapé !
Il vaut mieux mettre ça sur la molette car sinon après, on ne pourra plus cliquer sur un icone ou faire un click droit sans que la souris ce barre : pas pratique :wink: . Mais très bonne idée, si tu en as d'autres je prend (le message en entier c'est mieux aussi, là je comprends toujours pas ce qui c'est passé)
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

pour le coup ! tu pourrai pas nous la mettre comme ça

Code : Tout sélectionner

 MouseMove(dx.l,dy.l,AX.l,AY.l,VX.l,VY.l,Delay.l)
(je l'ai fait pour moi)

car je trouve que enchevetrer les paramettre c'est pas tres cool ! :)

je prefere que l'on donne les coordonées x et y de depart puis les coordonées x et y d'arrivée !!! pour moi c'est plus clair comme ça !! :D

surtout si tu doit faire une petite lib avec autant se mettre d'accord ! d'accord ? :D

sinon , j'ai oublier de te dire Bravo c'est du bon boulot ça !!
et ça va profiter a tous !! c'est ça qui est cool! :D

j'imagine regis en train de se faire une petite demo de ses soft avec c'ette lib

il va pouvoir montrer en direct comment utiliser son usine a gaz d'explorateur !!
:lol: :lol:

Merci encore d'etre ......... les pros du pure ou les pures pros
(ça fait pub pour les saucisses !! ) les purs porc !!! :lol: :lol: :lol:


:D
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

j'imagine regis en train de se faire une petite demo de ses soft avec c'ette lib
c'est pas c... enfin pas idiot pour une fois ce que tu dis :lol:

et d'abord, c'est quoi ce commentaire désobligeant sur mon Bi-Exploreur, hein alors :mrgreen:
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Oliv
Messages : 2117
Inscription : mer. 21/janv./2004 18:39

Message par Oliv »

Le Soldat Inconnu a écrit :
j'imagine regis en train de se faire une petite demo de ses soft avec c'ette lib
c'est pas c... enfin pas idiot pour une fois ce que tu dis :lol:

et d'abord, c'est quoi ce commentaire désobligeant sur mon Bi-Exploreur, hein alors :mrgreen:
déjà l'idée de ce type de commandes, c'est de lui :P
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

et d'abord, c'est quoi ce commentaire désobligeant sur mon Bi-Exploreur, hein alors
Ben c'est la realité, tout simplement.

Windows Commander = Simple, Rapide, Efficace
Bi-Explorer = .... (No Comment)

Mais c'est mon avis perso, j'ai le droit de ne pas aimer, ce qui n'enlève rien à ton travail. :wink:
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

ho , pour moi , c'etait juste une blague !! :D

j'utilise n'y l'un n'y l'autre !!!

d'ailleurs j'envisage le retour au DOS
car au moins on se prenaient la tete pour quelque chose
maintenant c'est trop facile , y a plus d'interret !! :D
d'ailleur je m'amuse beaucoup avec les emulateurs en ce moment
rejouer a lemming avec "Steem" c'est exellent pour mes 2 neuronnes !! :lol:

déjà l'idée de ce type de commandes, c'est de lui Razz
disons que j'ai un quart de l'idee et que tu a fait les 3 quart du boulot !! :D :D
Oliv
Messages : 2117
Inscription : mer. 21/janv./2004 18:39

Message par Oliv »

oui a peut près :D (pour le quart :D ), d'ailleur j'ai encore besoin de ton imagination, comment renommer MouseMoveEx dans le code qui suis ?
Pour lemmings c'est vrai que c'était génial, j'ai appris à utiliser dos et le PC rien que pour jouer à ça. Il en on sortit un en 3D récement (1999 ?) mais il est moins bien.

enfin bon, j'ai ajouté la procédure MouseMoveEx() qui prend le coordonnées actuelles de la souris comme point de départ

Code : Tout sélectionner

#D_Bas = 0 : #D_Haut = 1 : #D_Click = 2 : #D_DoubleClick = 3 ; bouton de droite 
#G_Bas = 4 : #G_Haut = 5 : #G_Click = 6 : #G_DoubleClick = 8 ; Bouton de gauche 
#M_Bas = 9 : #M_Haut = 10 : #M_Click = 11 : #M_DoubleClick = 12 ; bouton du milieu 

Procedure MouseEvent(Ereignis.l) 
  Mem.l=GlobalAlloc_(0,8) 
  GetCursorPos_(Mem) 
  mouse_event_(Ereignis | $8000,PeekL(Mem)*($FFFF/GetSystemMetrics_(0)),PeekL(Mem+4)*($FFFF/GetSystemMetrics_(1)),0,GetMessageExtraInfo_()) 
  GlobalFree_(Mem) 
EndProcedure 

Procedure MouseClick(Option.b) 
  Select Option 
    Case #G_Bas 
      MouseEvent($2) 
    Case #G_Haut 
      MouseEvent($4) 
    Case #G_Click 
      MouseEvent($2) 
      MouseEvent($4) 
    Case #G_DoubleClick 
      MouseEvent($2) 
      MouseEvent($4) 
      MouseEvent($2) 
      MouseEvent($4) 
      
    Case #D_Bas 
      MouseEvent($8) 
    Case #D_Haut 
      MouseEvent($10) 
    Case #D_Click 
      MouseEvent($8) 
      MouseEvent($10) 
    Case #D_DoubleClick 
      MouseEvent($8) 
      MouseEvent($10) 
      MouseEvent($8) 
      MouseEvent($10) 
      
    Case #M_Bas 
      MouseEvent($20) 
    Case #M_Haut 
      MouseEvent($40) 
    Case #M_Click 
      MouseEvent($20) 
      MouseEvent($40) 
    Case #M_DoubleClick 
      MouseEvent($20) 
      MouseEvent($40) 
      MouseEvent($20) 
      MouseEvent($40) 
  EndSelect 
EndProcedure 

Procedure MouseMove(DX.l,DY.l,AX.l,AY.l,VX.l,VY.l,Delay.l) 
; Arguments : Depart X -  Depart Y - Arrivée X - Arrivée Y - Vitesse X - Vitesse Y - Temps d'attente entre deux boucles) 
  If DX - AX > 0 ; Si on va vers la gauche 
    SensX = 1 
  EndIf 
  If DY- AY > 0 ; Si on va vers le haut 
    SensY = 1 
  EndIf 
  Repeat 
    If SensX = 1 
      If DX > AX 
        DX - VX 
      Else 
        DX = AX 
      EndIf 
    Else 
      If DX < AX 
        DX + VX 
      Else 
        DX = AX 
      EndIf 
    EndIf 
    If SensY = 1 
      If DY > AY 
        DY - VY 
      Else 
        DY = AY 
      EndIf 
    Else 
      If DY < AY 
        DY + VY 
      Else 
        DY = AY 
      EndIf 
    EndIf 
    SetCursorPos_(DX,DY) 
    If DX = AX And DY = AY : Break : EndIf 
    Delay(Delay) 
  ForEver 
EndProcedure

Procedure MouseMoveEx(AX.l,AY.l,VX,VY,Delay)
  GetCursorPos_(Pos.point)
  MouseMove(Pos\X,Pos\Y,AX,AY,VX,VY,Delay)
EndProcedure

MouseMoveEx(10,760,5,5,20)
MouseClick(#G_Click) 
MouseMoveEx(310,710,5,1,20) 
MouseClick(#G_Click) 
MouseMoveEx(650,372,5,5,20) 
MouseClick(#G_Click) 
 
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

GEANT !!! :D

et en plus y a moins de parametres !!!



que pense tu de

mouse_go()
ou go_mouse()
mouse_start

bouge_de_la() :lol:
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

tien j'ai rajouté une fonction !!!

Mousesignale(x,y,taille,temp) car cela peut etre utile de signaler un truc sur l'ecran !!! :lol:

***********************************************
* x=x de l'endroit que l'on veut signaler *
* y=y de l'endroit que l'on veut signaler *
* taille = la taille du cercle *
* temps = le temps que l'on veut que dure l'effet !! :D *
***********************************************

Code : Tout sélectionner

#D_Bas = 0 : #D_Haut = 1 : #D_Click = 2 : #D_DoubleClick = 3 ; bouton de droite
#G_Bas = 4 : #G_Haut = 5 : #G_Click = 6 : #G_DoubleClick = 8 ; Bouton de gauche
#M_Bas = 9 : #M_Haut = 10 : #M_Click = 11 : #M_DoubleClick = 12 ; bouton du milieu

Procedure MouseEvent(Ereignis.l)
    Mem.l=GlobalAlloc_(0,8)
    GetCursorPos_(Mem)
    mouse_event_(Ereignis | $8000,PeekL(Mem)*($FFFF/GetSystemMetrics_(0)),PeekL(Mem+4)*($FFFF/GetSystemMetrics_(1)),0,GetMessageExtraInfo_())
    GlobalFree_(Mem)
EndProcedure

Procedure MouseClick(Option.b)
    Select Option
        Case #G_Bas
            MouseEvent($2)
        Case #G_Haut
            MouseEvent($4)
        Case #G_Click
            MouseEvent($2)
            MouseEvent($4)
        Case #G_DoubleClick
            MouseEvent($2)
            MouseEvent($4)
            MouseEvent($2)
            MouseEvent($4)
            
        Case #D_Bas
            MouseEvent($8)
        Case #D_Haut
            MouseEvent($10)
        Case #D_Click
            MouseEvent($8)
            MouseEvent($10)
        Case #D_DoubleClick
            MouseEvent($8)
            MouseEvent($10)
            MouseEvent($8)
            MouseEvent($10)
            
        Case #M_Bas
            MouseEvent($20)
        Case #M_Haut
            MouseEvent($40)
        Case #M_Click
            MouseEvent($20)
            MouseEvent($40)
        Case #M_DoubleClick
            MouseEvent($20)
            MouseEvent($40)
            MouseEvent($20)
            MouseEvent($40)
    EndSelect
EndProcedure

Procedure MouseMove(dx.l,dy.l,AX.l,AY.l,VX.l,VY.l,Delay.l)
    ; Arguments : Depart X -  Depart Y - Arrivée X - Arrivée Y - Vitesse X - Vitesse Y - Temps d'attente entre deux boucles)
    If dx - AX > 0 ; Si on va vers la gauche
        SensX = 1
    EndIf
    If dy- AY > 0 ; Si on va vers le haut
        SensY = 1
    EndIf
    Repeat
        If SensX = 1
            If dx > AX
                dx - VX
            Else
                dx = AX
            EndIf
        Else
            If dx < AX
                dx + VX
            Else
                dx = AX
            EndIf
        EndIf
        If SensY = 1
            If dy > AY
                dy - VY
            Else
                dy = AY
            EndIf
        Else
            If dy < AY
                dy + VY
            Else
                dy = AY
            EndIf
        EndIf
        SetCursorPos_(dx,dy)
        If dx = AX And dy = AY : Break : EndIf
        Delay(Delay)
    ForEver
EndProcedure

Procedure MouseMoveEx(AX.l,AY.l,VX,VY,Delay)
    GetCursorPos_(Pos.POINT)
    MouseMove(Pos\x,Pos\y,AX,AY,VX,VY,Delay)
EndProcedure


Procedure Mousesignale(AX.l,AY.l,taille,temp) 
    For compt=1 To temp
        x=taille * Cos( compt) + (AX.l )
        y=taille * Sin( compt) + (AY.l) 
        MouseMove(x,y,x+1,y+1,10,10,10) 
    Next compt
EndProcedure





Mousesignale(500,500,20,50)



Oliv
Messages : 2117
Inscription : mer. 21/janv./2004 18:39

Message par Oliv »

sympa :D Par contre MouseSignal, si tu l'appelle mouse, ne met pas de e à signal :wink: Pour Bouge_De_là c'est une bonne idée :D
Répondre