Je vous met au défit

Résolu
cs_exode Messages postés 10 Date d'inscription samedi 11 novembre 2000 Statut Membre Dernière intervention 22 mars 2005 - 22 mars 2005 à 12:48
cs_exode Messages postés 10 Date d'inscription samedi 11 novembre 2000 Statut Membre Dernière intervention 22 mars 2005 - 22 mars 2005 à 21:47
Bonjour,

Je vous met au défit de faire un code d'enregistrement
des coordonées X,Y de la souris.

Je m'explique, ce code consisterait à enregistrer en
fichier texte les coordonées de la souris à partir d'un clic
soutenu, l'enregistrement prend fin dès qu'on lache le clic.

Les donnés X,Y seraient enregistrer dans un fichier texte que l'on pourra utiliser plus tard pour répéter l'opération de la souris.

Ensuite, un formulaire demanderait le nom d'enregistrement
pour le fichier texte.

Un autre formulaire permetterais d'ouvrir un fichier texte existant et d'effectuer l'opération de déplacement.

Ce code viendrais s'ajouter à mon projet de commande
de déplacement pour une machine CN à moteur pas à pas,
La commande de la souris permetterais d'effectuer des opération complexe et de les répéter selon le fichier texte choisi.

Je me permet de vous mettre au défit car je ne suis pas pro de VB et j'aimerais vraiment pouvoir continuer mon projet.

20 réponses

cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 20
22 mars 2005 à 16:37
heu, désolé, mouse_event, c'est plutot pour simuler l'action de la souris. Essaie plutot ce code :

Private Type POINTAPI
X As Long
Y As Long
End Type
Private Declare Function SetCapture Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function ReleaseCapture Lib "user32" () As Long
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Dim Pt As POINTAPI
Private Sub Form_Load()
'KPD-Team 1999
'URL: http://www.allapi.net/
'E-Mail: [mailto:KPDTeam@Allapi.net KPDTeam@Allapi.net]
'redirect all mouse input to this form
SetCapture Me.hwnd
End Sub
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
ReleaseCapture
SetCapture Me.hwnd
End Sub
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
'Get the current cursor position
GetCursorPos Pt
Me.CurrentX = 0
Me.CurrentY = 0
'Clear the screen
Me.Cls
Me.Print "Cursor position:"
'Print the mouse coördinates to the form
Me.Print "X:" + Str$(Pt.X) + " Y:" + Str$(Pt.Y)
Me.Print " (Press ALT-F4 to unload this form)"
SetCapture Me.hwnd
End Sub
Private Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
ReleaseCapture
SetCapture Me.hwnd
End Sub

A toi de l'adapter.

Loup Gris
3
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 20
22 mars 2005 à 16:49
Tiens, c jour de bonté, dans le code ci-dessus, tu mets :

Open "c:\temp\truc1.txt" For Append As #1

Print #1, "X:" + Str$(Pt.X) + " Y:" + Str$(Pt.Y)
Close #1
ReleaseCapture
SetCapture Me.hwnd

dans le Sub Form_MouseUp(...) et le tour est joué.

Loup Gris
3
cs_MasterHack Messages postés 586 Date d'inscription jeudi 18 septembre 2003 Statut Membre Dernière intervention 13 février 2008 2
22 mars 2005 à 13:11
utilise juste l'api GetCursorPos avec un petit timer et un tableau a deux dimenssions
et n'oublie pas le type POINTAPI


<HR>

Life is short...Learn more
Copy Rights <> Rights to Copy
0
cuq Messages postés 345 Date d'inscription mardi 3 juin 2003 Statut Membre Dernière intervention 21 mars 2008 2
22 mars 2005 à 14:00
ouais Y a pas vraiment de défis là dedans ...





Et n'oublis pas d'introduire une notion de facteur d'échelle en effet les XY de la position de tas souris ne sont pas forcément les XY de positions sur ta machine ...


Bon défit
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 20
22 mars 2005 à 16:23
Vois l'api mouse_event.

Loup Gris
0
cs_exode Messages postés 10 Date d'inscription samedi 11 novembre 2000 Statut Membre Dernière intervention 22 mars 2005
22 mars 2005 à 17:13
Merci je m'en vais essayer ça tout de suite...
0
cs_exode Messages postés 10 Date d'inscription samedi 11 novembre 2000 Statut Membre Dernière intervention 22 mars 2005
22 mars 2005 à 17:57
C'est ok, ça marche Nickel,

J'ai juste ajouté un Timer avec interval de 100...

J'ai encore une autre question, maintenant que j'ai mon fichier "truc1.txt", comme je fait pour reproduire l'événement de la souris à partir de ce fichier ?

Merci pour votre aide, c'est super cool
0
cs_MasterHack Messages postés 586 Date d'inscription jeudi 18 septembre 2003 Statut Membre Dernière intervention 13 février 2008 2
22 mars 2005 à 18:17
en prenant compte du code en haut tu ouvre le Fichier
Declare Function SetCursorPos Lib "user32" (ByVal x As Long, _
ByVal y As Long) As Long
dim Variable as string,x() as integer,y() as integer
open "c:\temp\truc1.txt"
for input as #1
while not eof(1)
line input #1,Variable
x=val(Mid(Text1, 3, InStr(Text1, "Y:") - 3))
y=val(Mid(Text1, 3, InStr(Text1, "Y:") - 3))
wend
close
dans un timer
for i=lboun(x) to ubound(x)
setcursorPos x(i),y(i)
next

<HR>

Life is short...Learn more
Copy Rights <> Rights to Copy
0
cs_MasterHack Messages postés 586 Date d'inscription jeudi 18 septembre 2003 Statut Membre Dernière intervention 13 février 2008 2
22 mars 2005 à 18:19
MODIFICATION
en prenant compte du code en haut tu ouvre le Fichier
Declare Function SetCursorPos Lib "user32" (ByVal x As Long, _
ByVal y As Long) As Long
dim Variable as string,x() as integer,y() as integer,n as long
open "c:\temp\truc1.txt" for input as #1
while not eof(1)
line input #1,Variable
x(n)=val(Mid(Text1, 3, InStr(Text1, "Y:") - 3))
y(n)=val(Mid(Text1, 3, InStr(Text1, "Y:") - 3))
n=n+1
wend
close
dans un timer
for i=lboun(x) to ubound(x)
setcursorPos x(i),y(i)
next

desole

<HR>

Life is short...Learn more
Copy Rights <> Rights to Copy
0
cs_exode Messages postés 10 Date d'inscription samedi 11 novembre 2000 Statut Membre Dernière intervention 22 mars 2005
22 mars 2005 à 18:49
ok, merci...

mais j'ai un problème pour comprendre ou inclure ce code,

je mets :
Declare Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As Long) As Long
dim Variable as string,x() as integer,y() as integer,n as long

après

Private Type POINTAPI
x As Long
y As Long
End Type
Private Declare Function SetCapture Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function ReleaseCapture Lib "user32" () As Long
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long

et ensuite je mets dans un autre timer :

Open "c:\temp\truc1.txt" For Input As #1
While Not EOF(1)
Line Input #1, Variable
x(n) = Val(Mid(Text1, 3, InStr(Text1, "Y:") - 3))
y(n) = Val(Mid(Text1, 3, InStr(Text1, "Y:") - 3))
n = n + 1
Wend
Close


For i = LBound(x) To UBound(x)
SetCursorPos x(i), y(i)
Next

j'ai essayé mais ça ne marche pas...

désolé...suis novice, mais j'en apprends tout les jours.
0
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 20
22 mars 2005 à 18:54
Pour l'exploitation, je me rends compte que mon code :
Open "c:\temp\truc1.txt" For Append As #1

Print #1, "X:" + Str$(Pt.X) + " Y:" + Str$(Pt.Y)
Close #1
ReleaseCapture
SetCapture Me.hwnd

doit être remplacé par :
Open "c:\temp\truc1.txt" For Append As #1

Print #1, trim(Str$(Pt.X)) & trim(Str$(Pt.Y))
Close #1
ReleaseCapture
SetCapture Me.hwnd

Ainsi, pour l'exploitation il est plus facile de coder, dans un autre projet :
Const MOUSEEVENTF_LEFTDOWN = &H2
Const MOUSEEVENTF_LEFTUP = &H4

Declare Function SetCursorPos Lib "user32.dll" (ByVal x As Long, ByVal y As Long) As Long
Declare Sub mouse_event Lib "user32" _
( _
ByVal dwFlags As Long, _
ByVal dx As Long, _
ByVal dy As Long, _
ByVal cButtons As Long, _
ByVal dwExtraInfo As Long _
)

sub form_load() 'ou sub command1_click() ou autre
dim buf as string
dim variable() as string
open "c:\temp\truc1.txt" for input as #1
while not eof(1)
line input #1,buf
variable = split(buf," ")
call clic(cint(variable(0)), cint(variable(1)))
close #1
end sub

'simulation du clic
Sub Clic(x As Integer, y As Integer)
'placer la souris par sécurité (pour processeurs lents)
Call SetCursorPos(x, y)
mouse_event MOUSEEVENTF_LEFTDOWN + MOUSEEVENTF_LEFTUP, x, y, 0, 0
End Sub

Si problème, suis à l'écoute.

Loup Gris
0
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 20
22 mars 2005 à 18:58
oups, je suis allé trop vite,

c pas
Print #1, trim(Str$(Pt.X)) & trim(Str$(Pt.Y))
mais
Print #1, trim(Str$(Pt.X)) & " " & trim(Str$(Pt.Y))

Loup Gris
0
cs_exode Messages postés 10 Date d'inscription samedi 11 novembre 2000 Statut Membre Dernière intervention 22 mars 2005
22 mars 2005 à 19:30
Merci...mais...problème......

En execution ça me met : Erreur d'éxécution '52' : Nom ou numéro de fichier incorrect. - et en déboguage ça se stop à : While Not EOF(1).

mis à part ça j'ai du remplaçer : Declare Function...

par

Private Declare Function...

Je sens que ça y est prèsque....
0
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 20
22 mars 2005 à 20:24
Encore trop vite, donc oubli d'un loop :
sub form_load() 'ou sub command1_click() ou autre
dim buf as string
dim variable() as string
open "c:\temp\truc1.txt" for input as #1
while not eof(1)
line input #1,buf
variable = split(buf," ")
call clic(cint(variable(0)), cint(variable(1)))
loop
close #1
end sub

Sinon, le mieux, au cas où tu aies un autre fichier texte d'ouvert :
sub form_load() 'ou sub command1_click() ou autre
dim buf as string
dim variable() as string
dim nf as integer
nf = freefile
open "c:\temp\truc1.txt" for input as #nf
while not eof(nf)
line input #nf,buf
variable = split(buf," ")
call clic(cint(variable(0)), cint(variable(1)))
loop
close #nf
end sub

Loup Gris
0
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 20
22 mars 2005 à 20:36
Autre prob possible, il faut sans doute coder une pause entre chaque clic() du style : for i = 0 to x: doevents : next pour laisser le temps au prog de digérer (surtout s'il y a affichage de page web). La valeur de x, c'est à toi de la déterminer. Un ex, pour automatiser des clics sur des pages intranet dans ma boite, j'ai mis x = 300000. Il y a sans doute mieux mais pour l'instant, ça marche bien.

Loup Gris
0
cs_exode Messages postés 10 Date d'inscription samedi 11 novembre 2000 Statut Membre Dernière intervention 22 mars 2005
22 mars 2005 à 20:44
il y a juste un blème, j'aimerais savoir ce que je doit mettre
dans mon timer pour que chaque ligne de mon fichier *.txt
soie lue et reproduite à l'identique de la capture.
0
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 20
22 mars 2005 à 20:52
Les codes que je t'ai donnés ne nécessitent pas de timer. Explique pourquoi tu en utilises un ?

Loup Gris
0
cs_MasterHack Messages postés 586 Date d'inscription jeudi 18 septembre 2003 Statut Membre Dernière intervention 13 février 2008 2
22 mars 2005 à 21:10
c'est juste que la boucle while ça va viiite il ne pouras pas remarquer ce qui se passe

<HR>

Life is short...Learn more
Copy Rights <> Rights to Copy
0
cs_exode Messages postés 10 Date d'inscription samedi 11 novembre 2000 Statut Membre Dernière intervention 22 mars 2005
22 mars 2005 à 21:29
J'ai enregistrer une séquence de mouvement de souris d'environ 20 sec, ce qui me fait env. 200 lignes de coordonées dans mon fichiers truc1.txt,

Le blème c'est que quand je lance mon progm, rien ne se passe, même pas un petit mouvement de ma souris.

Si je met un point d'arrêt, je peux effectivement voir que mes variables son chargé avec les premières coordonés de mon ficher, mais ça semble s'arrêter là...
0
cs_exode Messages postés 10 Date d'inscription samedi 11 novembre 2000 Statut Membre Dernière intervention 22 mars 2005
22 mars 2005 à 21:47
Euréka !!!

ça marche, c'était éffectivement la boucle while qui foutait le merdier.... :o)...

Faut pô m'en vouloir ch'uis suisse alors un peu lent !!

J'ai donc mis une pose entre chaque boucle et ça marche.

Je vous remercie infiniment pour votre aide, parce que sans vous je n'y serais jamais arrivé, suis même étonné d'y être déjà.
Reste plus qu'a finioler tout ça !

Bonne soirée à tous
0
Rejoignez-nous