Simuler les évènements souris

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

sympa aussi :P

juste une petite remarque de 'style' mais le prends surtout pas mal

au lieu d'écrire des trucs comme çà :

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
c'est tellement plus lisible et pratique comme çà :

Code : Tout sélectionner

Enumeration
  #D_Bas ; Bouton de droite 
  #D_Haut
  #D_Click
  #D_DoubleClick
  #G_Bas ; Bouton de gauche 
  #G_Haut
  #G_Click
  #G_DoubleClick
  #M_Bas ; Bouton du milieu 
  #M_Haut
  #M_Click
  #M_DoubleClick
EndEnumeration
en tout cas, c bien vu ton truc...
ya déjà un truc un peu ds le genre ds windows, quand on appuie sur la touche Ctrl ya un rond qui s'affiche autour du curseur pour signaler sa position, c'est présenté par microsoft comme un truc pour handicapé mais ya pas que les handicapés qui l'utilisent, moi oui parfois par ex :D
Image
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

ah et pis juste une chose :
pourrais-tu rajouter le fait que le curseur reviennent à sa position originale après avoir signalé un truc :roll:
Image
Oliv
Messages : 2117
Inscription : mer. 21/janv./2004 18:39

Message par Oliv »

oui, je met des énumerations d'habitude, mais là j'avais fait un code ou ça ne se suivait pas pour diverses raisons, en réorganisant j'ai tout changé mais j'ai pas repansé à ça :oops: merci
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

voici la modification de ma procedure selon les directives iso 90009
de Flype et d'oliv (pour le nom)!! :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 Mousesignal(AX.l,AY.l,taille,temp) 
    GetCursorPos_(Pos.POINT)
    xr=Pos\x:yr=Pos\y
    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
    
     MouseMove(x,y,xr,yr,8,8,2)
EndProcedure





Mousesignal(500,500,20,50)




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

Message par Oliv »

Fait attention de bien faire les mises à jours, cette norme évolue très vite
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

ca passe toujours pas les controles de qualité iso-normé
t'a tjs pas changé les 2 premières lignes enfin j'insiste pas sinon tu va me casser la tronche ce qui serait un peu dommage
:D :wink:
Image
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

les premiere ligne appartiennent a oliv !!! :)

c'est donc a lui d'y toucher !!! :D
Oliv
Messages : 2117
Inscription : mer. 21/janv./2004 18:39

Message par Oliv »

ahh je pensais que c'était les 23 premières lignes de ta procédure moi :oops: . Je l'avais fait pour moi mais c'est vrai que je ne l'avait pas mis sur le forum :oops: :oops:

Code : Tout sélectionner

Enumeration 
  #D_Bas ; Bouton de droite 
  #D_Haut 
  #D_Click 
  #D_DoubleClick 
  #G_Bas ; Bouton de gauche 
  #G_Haut 
  #G_Click 
  #G_DoubleClick 
  #M_Bas ; Bouton du milieu 
  #M_Haut 
  #M_Click 
  #M_DoubleClick 
EndEnumeration

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 Mousesignal(AX.l,AY.l,taille,temp) 
    GetCursorPos_(Pos.POINT) 
    xr=Pos\x:yr=Pos\y 
    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 
    
     MouseMove(x,y,xr,yr,8,8,2) 
EndProcedure 





Mousesignal(500,500,20,50) 

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) 
mycleo
Messages : 17
Inscription : dim. 29/août/2004 19:07

Créé un programme robot résidant wow...c'est un bon défi...

Message par mycleo »

Merci Oliv :D pour le beau travail que vous avez fait. Je ne croyais pas avoir ca aussi rapidement... La j'ai seulement la version démo je ne peux pas le tester car je ne peux pas le compiler avec la démo si tu as un exécuteble j'aprécirais... merci encore vous avez été sympa Salut mycleo
Oliv
Messages : 2117
Inscription : mer. 21/janv./2004 18:39

Message par Oliv »

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

Message par Oliv »

Suite à la demande de mycleo je commente un peu :D (commentaires au dessus de chaque nom de procédure)

Code : Tout sélectionner

Enumeration 
  #D_Bas ; Bouton de droite 
  #D_Haut 
  #D_Click 
  #D_DoubleClick 
  #G_Bas ; Bouton de gauche 
  #G_Haut 
  #G_Click 
  #G_DoubleClick 
  #M_Bas ; Bouton du milieu 
  #M_Haut 
  #M_Click 
  #M_DoubleClick 
EndEnumeration 

; Gère les clicks des souris (appelée par MouseClick)
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 

; Appelle MouseEvent() en fonction de la demande des utilisateurs
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 

; Envoi la souris au point AX,AY à partir des points DX,DY avec VX et VY comme vitesse de déplacement et Delay = temps entre chaque déplacements
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 

; Envoi la souris de la position où elle se trouve au point AX,AY avec VX et VY comme vitesse de déplacement et Delay = temps entre chaque déplacement.
Procedure MouseMoveEx(AX.l,AY.l,VX,VY,Delay) 
    GetCursorPos_(Pos.POINT) 
    MouseMove(Pos\x,Pos\y,AX,AY,VX,VY,Delay) 
EndProcedure 

; Fait tourner la souris autour des points AX,AY avec Taille pour Rayon et temp = temps entre chaque déplacement. (fonction faite par dobro)
Procedure Mousesignal(AX.l,AY.l,taille,temp) 
    GetCursorPos_(Pos.POINT) 
    xr=Pos\x:yr=Pos\y 
    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 
    
     MouseMove(x,y,xr,yr,8,8,2) 
EndProcedure 

Mousesignal(500,500,20,50) 


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) 
Coilà, j'espère avoir répondu à tes questions, si tu veux des renseigements précis dis le moi (je ne savais pas trop qui commenter)
Répondre