Autoit Comment définir la position d'un pixel suivant la résolution

  • Auteur de la discussion Anonymous
  • Date de début
A

Anonymous

Invité
#1
Bonjour

Voila je cherche a avoir la position d'un pixel mais suivant la resolution, je n'arrive pas a garder la position du pixel...

J'avais fais cela mais sa ne marche pas pour toute les resolutions

Code:
$x = 740*(@DesktopWidth/800)
$y = 270*(@DesktopHeight/600)
740 et 270 sont les coordonnées du pixel en 800/600.

Si quelqu'un a une meilleur methode ?

Edit: Le probleme vient de la taille de la zone de jeu de D. que je ne comprend pas. Comment est elle redimensionné suivant la resolution ... Sinon la solution est de definir la taille de la marge noir et de la soustraire x2 par rapport a la largeur de la resolution, mais pour la hauteur, toujours bloqué.
 
Inscrit
4 Février 2012
Messages
14
Reactions
0
#2
Re: Comment définir la position d'un pixel suivant la résolu

Bonjour, la taille de la fenêtre de D. reste proportionnel sur chaque écran. Il te faut donc calculer le coefficient de proportionnalité et d'utilisé celui ci pour avoir la position du pixel.
Code:
Func Multi_Resolution()
	Global $WinPos = WinGetPos($NAME)
	Local $ModelSize[2] = [916, 758] ; x, y de ta fenêtre D.
	Global $Coeff[2] = [$WinPos[2] / $ModelSize[0], $WinPos[3] / $ModelSize[1]] ; Calcul du coefficient de proportionnalité.
	
EndFunc

Func PosX($Value)
	$PosF = $WinPos[0] + ($Value * $Coeff[0])
	Return $PosF
	
EndFunc

Func PosY($Value)
	$PosF = $WinPos[1] + ($Value * $Coeff[1])
	Return $PosF

EndFunc
Exemple pour l'utilisé :

Code:
MouseClick("left", PosX(420), PosY(315))
Edit : J'ai oublié de préciser qu'il ne faut pas redimensionner la fenêtre ni la déplacer, il faut aussi que les positions des pixel sur ton écran soit prise comme si le coin en haut à gauche se trouve en 0,0.
 
A

Anonymous

Invité
#3
Re: Comment définir la position d'un pixel suivant la résolu

Donc $WinPos[0] et $WinPos[1] seront toujours a 0 ?

et
Local $ModelSize[2] = [916, 758] ; x, y de ta fenêtre D.
Correspond a quoi, la fenetre de jeux sans les marge noir ou la taille de la fenetre avec marge + TitleBar ?

Je me pose donc la question suivante a quoi sert la $WinPos, et ou prend t'on en compte la resolution ici ?
 
Inscrit
4 Février 2012
Messages
14
Reactions
0
#4
Re: Comment définir la position d'un pixel suivant la résolu

Non justement il ne prend pas en compte les marges noirs, il faut laissé la fenêtre D. comme au lancement, $ModelSize prend en compte de la TitleBar.
$WinPos sert à savoir où se positionne la fenêtre D. (pour ne pas à avoir la changer de place) ainsi que sa taille pour ensuite calculer le coefficient de proportionnalité celons les résolutions.
 
A

Anonymous

Invité
#5
Re: Comment définir la position d'un pixel suivant la résolu

Donc tu dois adapter ton script a chaque resolution pour $ModeleSize, alors que WinGetClientSize("[active]") te donne direct ces valeurs.

Je vais faire des tests avec ce que tu ma donner.

Edit : Sa ne marche pas,

Je vais te donner mon code
Code:
Global $Coeff, $WinPos

Sleep(5000)

Func Multi_Resolution()
   Local $ModelSize
   $WinPos = WinGetPos("[active]")
   $ModelSize = WinGetClientSize("[active]"); x, y de ta fenêtre D.
   $Coeff[2] = [$WinPos[2] / $ModelSize[0], $WinPos[3] / $ModelSize[1]] ; Calcul du coefficient de proportionnalité.
EndFunc ;--> Multi_Resolution

Func PosX($Value)
   Return $WinPos[0] + ($Value * $Coeff[0])
EndFunc ;--> PosX

Func PosY($Value)
   Return $WinPos[1] + ($Value * $Coeff[1])
EndFunc ;--> PosY

MouseClick("left",PosX(680),PosY(310),1,1)
Je cherche a cliquer sur la barre de saisie 'Identifiant', je prend mes pixels 680 et 310 en resolution 1366*768. et meme sans changer de resolution sa ne marche deja pas.
 
Inscrit
4 Février 2012
Messages
14
Reactions
0
#6
Re: Comment définir la position d'un pixel suivant la résolu

Non justement tu n'as pas à modifier le script pour chaque résolution, change les valeurs [916, 758] par les tailles de ta fenêtre D.

Code:
Sleep(5000)

Multi_Resolution()

Func Multi_Resolution()
   Global $WinPos = WinGetPos("[active]")
   Local $ModelSize[2] = [916, 758]; x, y de ta fenêtre D.
   Global $Coeff[2] = [$WinPos[2] / $ModelSize[0], $WinPos[3] / $ModelSize[1]] ; Calcul du coefficient de proportionnalité.

EndFunc

Func PosX($Value)
   $PosF = $WinPos[0] + ($Value * $Coeff[0])
   Return $PosF
EndFunc

Func PosY($Value)
   $PosF = $WinPos[1] + ($Value * $Coeff[1])
   Return $PosF
EndFunc

MouseClick("left",PosX(445),PosY(315),1,1)
Voila je n'ai pas essayer mais sa devrai fonctionner, te reste à changer les valeurs de $ModelSize par les tiennent (Même si la sa fonctionne étant donné que sa marche sous toute les résolutions mais il le faut pour que sa fonctionne avec tes autres positions de pixel)
 
A

Anonymous

Invité
#7
Re: Comment définir la position d'un pixel suivant la résolu

J'ai recuperer la taille de la fenetre "utilisé" a chaque resolution.

Taille fenetre -> Resolution

685*548 -> 800*600

895*716 -> 1024*768

685*548 -> 1280*600

835*668 -> 1280*720

895*716 -> 1280*768

895*716 -> 1360*768

895*716 -> 1366*768


On remarque facilement que la taille de la fenetre utiliser depend uniquement de la hauteur de la resolution, la difference entre la largeur utilisé et la largeur de la resolution est donc en marge noire

J'aurais été donc tenter de choper le coeff comme pour ma 1ere methode

600 /548=~ 1.09489
1.09489*716 = ~ 783.94

un peu loin quand meme de 768 :/

Edit: peut tu me montrer un screen de ce que tu prend dans ta taille de D.

Edit2 : En y repensant, la logique serais plus de faire ainsi

548/600= 0.91333
768*0.91333 = 701.44 au lieu de 716 ce qui est deja mieu mais sa me choque toujours
pour 716 il faut avoir 0.93221, la hauteur doit donc etre de 559.326

Edit3:
Si on arrive a trouver la hauteur de la fenetre, la largeur ce calcul ainsi
largeur = hauteur*1.25
 
Inscrit
4 Février 2012
Messages
14
Reactions
0
#8
Re: Comment définir la position d'un pixel suivant la résolu

Tu as du te trompé dans tes calculs, test mon code et tu véras par toi même que tu tombe au bon endroit (Quelque soit ta résolution)

Par exemple je cherche à cliquer en 300*300 (sur ma fenêtre D. qui est de 916*758).

Sur une fenêtre D. de 895*716 le clique se fera en 293,283 (qui est a même endroit sur les 2 fenêtre)
Coeff x : 895/916 = 0,977
Coeff y : 716/758 = 0,944
300*0.977 = 293
300*0.944 = 283
 
A

Anonymous

Invité
#9
Re: Comment définir la position d'un pixel suivant la résolu

En fait ce qui me pose probleme dans ton code, c'est que le calcul de ton coef n'est pas dynamique car tu doit entrer toi meme la dimension actuel de la fenetre D.

Coeff x : 895/916 = 0,977
Coeff y : 716/758 = 0,944

916 et 758 peuvent etre enregistrer en reference ok, mais comment calcule tu ton 895 et 716 dynamiquement?

C'est ce que j'essaye justement de trouver dans mon poste precedant. le coeff entre 2 taille, suivant la resolution

Edit :
je viens de penser a une solution, C'est peut etre ce que tu me propose que je viens juste de comprendre ^^

On a une résolution de 800x600, on cherche le pixel en [80,60] soit [10%/10%] donc en 1024/768 sa donne [102.4,76.8]

Il ne faut donc pas se baser sur la fenetre D. mais directement sur la resolution de l'ecran pour une utilisation dynamique.

Ici un fait un PixelSearch[102,76,103,77,0x00000) et le tour est joué !

Edit 2 :
En fait non :lol: , Car la taille de la fenetre D. est parfois la meme pour 2 largeur de resolution differente, le % va donc changer pour un pixel alors que la fenetre aura pas bouger, on va donc tomber a coter du pixel forcement ...

Edit 3:
Bon la solution que j'ai trouver c'est de forcer la fenetre a prendre une taille precise, ainsi on connais la position de chaque element.

Personnellement c'est pour un script d'autoconnexion, donc je ferais un $SW_MAXIMIZE apres saisie, mais bon, je suis sur qu'il y a un calcul bien precis, surement cacher dans le code de l'.exe.
 
Inscrit
4 Février 2012
Messages
14
Reactions
0
#10
Re: Comment définir la position d'un pixel suivant la résolu

Justement c'est WinGetPos() qui t'indique ces valeur (895 et 716) dont on va se servir pour trouver le coeff celons la résolution de l'utilisateur pour calculer la position des pixel.

Mon bot à été utilisé par de nombreuse personne et je n'ai jamais eu de souci de résolution donc je peux t'assurer que c'est ce qu'il te faut pour gerer la multi-résolution.
 
A

Anonymous

Invité
#11
Re: Comment définir la position d'un pixel suivant la résolu

Bon ok, je vais continuer de faire mes tests jusqu'a comprendre ce qui cloche pas chez moi ^^

Ok je viens enfin de comprendre ton 1er message, je jongle depuis le depart avec une fenetre deja agrandi, alors qu'en effet, au lancement la fenetre est cadrer a la taille optimal.

J'aurais du commencer par sa :roll:

Merci, je vais pouvoir enfin finir tranquillement mon petit script
 
A

Anonymous

Invité
#12
Re: Comment définir la position d'un pixel suivant la résolu

Une derniere question, avec quoi recupere tu la taille de ta fenetre D. ? Avec Autoit Windows Info ou WinGetClientSize ? car je ne trouve pas la meme chose mais dans les deux cas, sa ne marche pas ...
Code:
Func Multi_Resolution()
   $pid = WinGetHandle("D.")
   Global $WinPos = WinGetPos($pid)
   Local $ModelSize[2] = [763, 613] ; x, y de ta fenêtre D.
   Global $Coeff[2] = [$WinPos[2] / $ModelSize[0], $WinPos[3] / $ModelSize[1]] ; Calcul du coefficient de proportionnalité.
EndFunc

Func PosX($Value)
   $PosF = $WinPos[0] + ($Value * $Coeff[0])
   Return $PosF
EndFunc

Func PosY($Value)
   $PosF = $WinPos[1] + ($Value * $Coeff[1])
   Return $PosF
EndFunc
Multi_Resolution()
Sleep(2000)
MsgBox(0,"",PosX(481)&" "&PosY(245))
Avec ta methode :
Je prend un Pixel a partir de 0,0 de l'ecran je tombe sur [785,345]
Je prend maintenant le meme pixel a partir de la fenetre (coin en haut a gauche 0,0) je tombe sur [481,245]
Donc avec la methode que tu ma donner en prenant le PosX(481) et PosY(245) je dois retrouver 785 et 345, mais je trouve 788 et 333
Je ne comprend donc vraiment rien ...
 
Inscrit
4 Février 2012
Messages
14
Reactions
0
#13
Re: Comment définir la position d'un pixel suivant la résolu

Le problème devrai venir de la taille de ta fenêtre D. dans $WinPos car si tu n'as pas changé de résolution le coefficient est de 1 et que même le plus nul en math pourrai calculer une multiplication par 1 qui donnerai le même résultat.
 
A

Anonymous

Invité
#14
Re: Comment définir la position d'un pixel suivant la résolu

En placant la fenetre en 0,0 (WinMove), j'obtien bien coeff de 1, mais si je change la resolution avec une hauteur differente, il point le bon pixel mais c'est les zones de saisie qui ont zoomer, ou retrecie. Donc sa pointe encore a coter ...
 

d4rkv4n

Contributeur
Inscrit
6 Mai 2012
Messages
129
Reactions
0
#15
Re: Comment définir la position d'un pixel suivant la résolu

Une chose qu'il faut savoir, c'est qu'un écran fait, par exemple, 1920x1080 pixels. Si tu réduis la taille de la fenêtre à du 800x600, tu n'auras pas 1920x1080 pixels compactés dans du 800x600. Certains seront supprimés. Donc si tu arrives à cliquer sur un pixel en 1920x1080 mais pas en 800x600, faut pas s'étonner...
 

Geraff

Administrateur
Membre du personnel
Inscrit
13 Mars 2008
Messages
564
Reactions
0
#16
Re: Comment définir la position d'un pixel suivant la résolu

Il parlai de la fenêtre de base dans dofus.
De plus un pixel est un pixel au niveau de l'ordinateur donc normalement ce n'est pas senser changer la "taille" des pixels.
L'écran est juste un tableau à deux dimensions avec un numéro de couleurs dans chaque case.

Merci de ne pas remonter des sujets vieux de plus d'un mois !
 

bouh2

Membre Actif
Inscrit
12 Septembre 2008
Messages
184
Reactions
21
#17
Re: Comment définir la position d'un pixel suivant la résolu

La meilleure solution je pense est de définir une taille pour la fenêtre fixe, par exemple 800x600, à partir de là tu peux faire tes mesures.
 

d4rkv4n

Contributeur
Inscrit
6 Mai 2012
Messages
129
Reactions
0
#18
Re: Comment définir la position d'un pixel suivant la résolu

@Geraff > Oui je suis bien d'accord. Mais admettons que la fenêtre de D. fasse 1024x768. Donc sur la première ligne de pixels il y a 1024 couleurs. Si tu réduis à du 800x600, tu n'as plus ces 1024 couleurs. Tu en as perdu 224. Et donc, s'il arrive à trouver une couleur sur du 1024x768 mais pas du 800x600, c'est pas étonnant. Voilà ce que je voulais dire.

@bouh2 > Ou faire comme j'ai fais, ne pas chercher des couleurs mais bel et bien rechercher une case. Auquel cas tu recherches un tableau de couleurs dans une case, et non plus une couleur dans tout l'écran.
 

Geraff

Administrateur
Membre du personnel
Inscrit
13 Mars 2008
Messages
564
Reactions
0
#19
Re: Comment définir la position d'un pixel suivant la résolu

Si tu fais une route de 5 mètres tu peux mettre 2 voitures cote à coté, si tu en fais une de 2 mètre tu en perds 3 et tu ne retrouve pas la deuxième voiture.

CQFD.

Si tu changes la résolution de la fenêtre de base de dofus c'est normal que tu ne retrouves pas tout au même endroit.
 
Haut Bas