C/C++ PixelSearch autoit en c++

A

Anonymous

Invité
#1
Bonjours,

J'ai intégré l'autoit a mon programme en c++.
Mais je rencontre un petit problème avec la fonction suivante :

Code:
AU3_API void WINAPI AU3_PixelSearch(long nLeft, long nTop, long nRight, long nBottom, long nCol, /*default 0*/long nVar, /*default 1*/long nStep, LPPOINT pPointResult);
Je peux tout compléter sans problème sauf le pPointResult qui devra retourner les coordonné x,y de la couleur trouvée...
Mon test qui ne marche pas, mais voilà le genre de chose que sa devrais donner :

AU3_PixelSearch(0, 0, 674, 370, 0xFFFFFF, 0, 1, LPPOINT pPointResult);
SetCursorPos(&pPointResult);
Le but étant de bouger la souris le le point trouvé. Merci de votre aide :)
 
A

Anonymous

Invité
#2
Re Bonjour,

Quelques recherches et voilà ce que je trouve :

Code:
void RecherchePixel()
{

	LPPOINT Coord = NULL;
	AU3_PixelSearch(0, 0, 674, 370, 0xFFFFFF, 0, 1, Coord);
	AU3_MouseMove(Coord->x,Coord->y,10);

}
mais la il y a une erreur que je ne comprend pas bien :
Code:
Une exception de première chance de type 'System.AccessViolationException'
Une exception non gérée du type 'System.AccessViolationException'
Informations supplémentaires : Tentative de lecture ou d'écriture de mémoire protégée. Cela indique souvent qu'une autre mémoire est endommagée.
Merci de m'aider si possible
 
A

Anonymous

Invité
#3
Coord->x,Coord->y
Essaie de remplacer ça par Coord.x,Coord.y
 
Inscrit
22 Octobre 2011
Messages
34
Reactions
0
#4
Il aura une erreur de compilation si il fait ça, Coord étant un pointeur.

En fait, ton pointeur Coord restera NULL si la fonction AU3_PixelSearch ne trouve pas le pixel demandé. Résultat, au moment où tu utilises Coord->x / Coord->y, ton programme va tenter d'accéder à une case mémoire qui ne t'appartient pas (qui est d'ailleurs invalide dans ton cas, NULL correspond à l'adresse 0, une adresse non utilisée).
Je te conseille donc de vérifier que le pointeur n'est pas égal à NULL:
Code:
void RecherchePixel()
{

   LPPOINT Coord = NULL;
   AU3_PixelSearch(0, 0, 674, 370, 0xFFFFFF, 0, 1, Coord);
   if(Coord != NULL)
       AU3_MouseMove(Coord->x,Coord->y,10);

}
 
Inscrit
19 Octobre 2010
Messages
214
Reactions
0
#5
En fait, je serais surpris que AU3_PixelSearch se charge d'allouer la mémoire : à mon avis, tu dois le faire avant d'appeler cette fonction.
Sur quelle ligne leves-tu l'exception ?
 
Inscrit
22 Octobre 2011
Messages
34
Reactions
0
#6
Effectivement, après avoir regardé la documentation, au3_pixelSearch n'alloue pas la mémoire pour le pointeur. Donc soit tu alloues toi même ta mémoire (sans oublier de la libérer une fois que tu as fini d'utiliser Coord), soit tu passes simplement l'adresse d'une variable de type POINT.

Code:
void RecherchePixel()
{

   POINT Coord;
   AU3_PixelSearch(0, 0, 674, 370, 0xFFFFFF, 0, 1, &Coord);
   AU3_MouseMove(Coord.x,Coord.y,10);
}
 
A

Anonymous

Invité
#7
Merci de vos réponses, mais passer par une variable de type POINT ne marche pas non plus... :s
Pour ce qui est des "->" ou "." pour "Coord->x" ou "Coord.x" j'avais déjà essayer les 2 mais pareil il me fait "Une exception non gérée du type 'System.AccessViolationException'"

Voilà ce qu'il me dit quand je compile le dernier code de little-scaraby :
Sur la ligne : "AU3_MouseMove(Coord.x,Coord.y,10);"
->"Ceci est la prochaine instruction qui sera exécuté lorsque le thread retourne de la fonction active."
 
Inscrit
22 Octobre 2011
Messages
34
Reactions
0
#8
euh ça ça doit vouloir dit que tu as placé un breakPoint (intentionnellement ou non), c'est pas une erreur :)
 
A

Anonymous

Invité
#9
Euh je ne vois pas bien ce qu'est le breakPoint :s
Comment aurais-je pus en faire ?

Code:
	private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
				 	//RedimFen();
					RecherchePixel();
			 }
Code:
void RecherchePixel()
{
   POINT Coord;
   AU3_PixelSearch(0, 0, 674, 370, 0xFFFFFF, 0, 1, &Coord);
   AU3_MouseMove(Coord.x,Coord.y,10);
}
 
Inscrit
15 Avril 2011
Messages
457
Reactions
1
#10
J'ai le même problème, j'ai un message d'erreur que je comprends pas : "undefined reference to 'AU3_PixelSearch@32'".
Mon code :
Code:
POINT coord;
AU3_PixelSearch(330,60,1270,710,0xFFFFFF,0,1,&coord);
Quelqu'un sait ce que ça veut dire ?
 
A

Anonymous

Invité
#11
J'ai exactement le même problème que toi Nico , je na comprend pas pourquoi.

Peut-être qu'il faut un fichier .a ?
 
Inscrit
15 Avril 2011
Messages
457
Reactions
1
#12
Ah oui j'ai vu ton post, je pensais pas que c'était le même problème. J'espère que quelqu'un a la solution...
Pour le fichier .a, il y en a un avec le fichier .h qui s'appelle : "libautoitx3.a", donc ça ne vient pas de là.
 

FastFrench

Membre Actif
Inscrit
19 Octobre 2010
Messages
214
Reactions
0
#13
Vous avez probablement oublié de linker avec la bonne librairie.

Il faut aussi que la librairie soit compatible avec votre compilateur. L'extension .a est plus courant sur Unix (Linux). Avec MSVC, c'est généralement une extension .lib.
 

ToOnS

Membre Actif
Inscrit
8 Avril 2009
Messages
974
Reactions
0
#14
pourquoi utiliser une fonction autoit qui existe en c++ ? c'est vraiment vouloire reinventer la roue (qui tournera 1000 fois moins vite que la roue originale)

long Color;

Color = GetPixel(hDC, 0, 0);
 
Inscrit
15 Avril 2011
Messages
457
Reactions
1
#15
ToOnS a dit:
long Color;

Color = GetPixel(hDC, 0, 0);
T'es sûr que ça marche comme ça ?! Ça vérifie pas plutôt que le pixel à la position x=0 et y=0 est égal à la couleur donné ?


FastFrench a dit:
Vous avez probablement oublié de linker avec la bonne librairie.

Il faut aussi que la librairie soit compatible avec votre compilateur. L'extension .a est plus courant sur Unix (Linux). Avec MSVC, c'est généralement une extension .lib.
On a le choix entre entre 2 dossiers dans le dossier "AutoItX\StandardDLL" : "DevC" (CodeBlocks) et "VC6" (Visual C/C++). Moi, j'utilise CodeBlocks, j'ai linké le bon donc je vois pas où est le problème :S
 

ToOnS

Membre Actif
Inscrit
8 Avril 2009
Messages
974
Reactions
0
#16
oui ca verifie que le pixel à la position x=0 et y=0 est égal à la couleur , il suffit d'une double boucle qui incremente x et y pour scanner tout les pixels
 
Inscrit
15 Avril 2011
Messages
457
Reactions
1
#17
Oui j'ai essayé ça, ça met 137 secondes pour parcourir mon écran entièrement. Alors quand tu dis : "qui tournera 1000 fois moins vite que la roue originale", tu te trompes de beaucoup ! ^^

C'est pour ça que je veux utiliser les fonctions d'AutoIt.
 
A

Anonymous

Invité
#18
137 secondes !!!
Doit y avoir un probleme la, fait nous part de ton code.
 

ToOnS

Membre Actif
Inscrit
8 Avril 2009
Messages
974
Reactions
0
#19
essais ca , si ca met plus de 2 minutes alors tu peux mettre ton ordi a la poubelle et ca m'etonnerais meme que windows arrive a tourner dessus (meme windows 3.11) ma psp traite ca en meme pas 10 ms

#define BitmapPixel(b, x, y) ((b)->pixels[(y) * (b)->width + (x)])
#define ColorNoAlpha(p) ((p) & 0x00FFFFFF)
Code:
void GetPix(BITMAPCAPTURE *grab, DWORD pixel_color)
{
    int x, y, found;
    found = 0;
    for(y = 0; y < grab->height && !found; y++){
        for(x = 0; x < grab->width && !found; x++){
            if(ColorNoAlpha(BitmapPixel(grab, x, y)) == pixel_color)
                found = 1;
        }
    }
    if(found)
        printf("0x%08X pixel en (%d, %d)\n", pixel_color, --x, --y);
}
 

FastFrench

Membre Actif
Inscrit
19 Octobre 2010
Messages
214
Reactions
0
#20
Pour utiliser ton code ToOnS, il faut aussi qu'il fasse une capture au bon format au préalable.
 
Haut Bas