Autoit ImageSearch

09/19/2009 01:33 >Trib°lex<#1
moin Leuts,

hab ein problem mit einem Autoit ImageSearch Bot.Unzwar wenn ich den Bot starten erscheint er für ein bruchteil einer sec unten rechts iner taskleiste(da wo die uhr ist) dann schliest er sich wieder. Warum auch immer.

Hier mal der Script


HOTKEYSET("{F6}", "Start")
HotKeySet("{F5}", "Stop")
#include <ImageSearch.au3>


Func START()
$x1 = 0
$y1 = 0

$findImage1 = _ImageSearch("L", 1, $x1, $y1, 0)

If $findImage1 = 1 Then
Sleep (5000)
Send ("{enter}")
Sleep (2000)
Send ("123")
Sleep (1000)
Send ("{enter}")
Sleep (1000)
Send ("2009")
Send ("{enter}")
Sleep (20000)
Send ("{enter}")
EndIf
EndFunc

$x1 = 0
$y1 = 0

$findImage2 = _ImageSearch("P", 1, $x1, $y1, 0)

If $findImage2 = 1 Then
Sleep (5000)
EndIf

Func STOP()
Exit
EndFunc
09/19/2009 10:13 MoepMeep#2
Ohne auch nur die geringste ahnung von autoit zu haben, würd ich sagen, er findet das gesuchte nicht ;D
09/19/2009 10:36 bassbanane#3
Das Problem ist ganz einfach ;-) Wenn du das Script startest läuft er es einmal schnell durch und beendet wieder. Du musst es nur laufen lassen z.B. mit ner while schleife:
Quote:
#include <ImageSearch.au3>


$x1 = 0
$y1 = 0

$findImage2 = _ImageSearch("P", 1, $x1, $y1, 0)

If $findImage2 = 1 Then
Sleep (5000)
EndIf


while 1
HOTKEYSET("{F6}", "Start")
HotKeySet("{F5}", "Stop")
sleep(25)
WEnd




Func START()
$x1 = 0
$y1 = 0

$findImage1 = _ImageSearch("L", 1, $x1, $y1, 0)

If $findImage1 = 1 Then
Sleep (5000)
Send ("{enter}")
Sleep (2000)
Send ("123")
Sleep (1000)
Send ("{enter}")
Sleep (1000)
Send ("2009")
Send ("{enter}")
Sleep (20000)
Send ("{enter}")
EndIf
EndFunc



Func STOP()
Exit
EndFunc
09/19/2009 13:44 >Trib°lex<#4
Quote:
Originally Posted by bassbanane View Post
Das Problem ist ganz einfach ;-) Wenn du das Script startest läuft er es einmal schnell durch und beendet wieder. Du musst es nur laufen lassen z.B. mit ner while schleife:
vielen dank es hat geklappt. jetz hätte ich noch ne frage unzwar kann man es so machen das der bot nur nach bild 2 (P) sucht nachdem er Bild 1 (L) gefunden hatt also so:


Bild 1 gefunden - suche nach bild 2 - bild 2 gefunden - sucht nicht mehr nach bild 2 - nach z.b 20 min bild 1 wieder gefunden - sucht wieder nach bild 2 - bild 2 gefunden -hört auf nach bild2 zu suchen .... und immer so weiter

ist das dann so richtig ?

#include <ImageSearch.au3>

while 1
HOTKEYSET("{F6}", "Start")
HotKeySet("{F5}", "Stop")
sleep(25)
WEnd

Func START()

$x1 = 0
$y1 = 0

$findImage1 = _ImageSearch("L", 1, $x1, $y1, 0)

If $findImage1 = 1 Then
Sleep (5000)
Send ("{enter}")
Sleep (2000)
Send ("123")
Sleep (1000)
Send ("{enter}")
Sleep (1000)
Send ("2009")
Send ("{enter}")
Sleep (20000)
Send ("{enter}")
Sleep (15000)
$findImage2 = _ImageSearch("P", 1, $x1, $y1, 0)
If $findImage2 = 1 Then
Sleep (5000)
EndIf
EndIf
EndFunc

Func STOP()
Exit
EndFunc
09/19/2009 13:59 Maggot><#5
ich weis nicht ob das richtig ist bin selbe rnewbie drin

aber wenn man image 1 (L ) udn image 2 (P9 in einzelne funcs packt O.o und nur image 1 in eine while schleife einbaut?


ps.: les dir bitte die tuts durch ;)
09/19/2009 14:46 | Moep |#6
Habs zwar dein Problem net so ganz verstanden, aber vom ablauf her müsste/könnte es so funktionieren.

Code:
#include <ImageSearch.au3>

$x1 = 0
$y1 = 0

While 1
	
Do
	$findImage1 = _ImageSearch("L", 1, $x1, $y1, 0)
	$findImage2 = _ImageSearch("P", 1, $x1, $y1, 0)
	Sleep(100)
Until ($findImage1 = 1) Or ($findImage2 = 1)

If $findImage1 = 1 Then
	Sleep (5000)
	Send ("{enter}")
	Sleep (2000)
	Send ("123")
	Sleep (1000)
	Send ("{enter}")
	Sleep (1000)
	Send ("2009")
	Send ("{enter}")
	Sleep (20000)
	Send ("{enter}")
	Sleep (15000)
	
ElseIf $findImage2 = 1 Then
	Sleep (5000)
EndIf

WEnd
Oder alternativ so.

Code:
#include <ImageSearch.au3>

$x1 = 0
$y1 = 0

While 1
	
Do
	$findImage1 = _ImageSearch("L", 1, $x1, $y1, 0)
	Sleep(100)
Until $findImage1 = 1

If $findImage1 = 1 Then
	Sleep (5000)
	Send ("{enter}")
	Sleep (2000)
	Send ("123")
	Sleep (1000)
	Send ("{enter}")
	Sleep (1000)
	Send ("2009")
	Send ("{enter}")
	Sleep (20000)
	Send ("{enter}")
	Sleep (15000)
	
	Do
		$findImage2 = _ImageSearch("P", 1, $x1, $y1, 0)
		Sleep(100)
	Until $findImage2 = 1
	
	If $findImage2 = 1 Then
		Sleep (5000)
	EndIf
EndIf
WEnd
09/19/2009 15:25 >Trib°lex<#7
Quote:
Originally Posted by | Moep | View Post
Habs zwar dein Problem net so ganz verstanden, aber vom ablauf her müsste/könnte es so funktionieren.

Code:
#include <ImageSearch.au3>

$x1 = 0
$y1 = 0

While 1
	
Do
	$findImage1 = _ImageSearch("L", 1, $x1, $y1, 0)
	$findImage2 = _ImageSearch("P", 1, $x1, $y1, 0)
	Sleep(100)
Until ($findImage1 = 1) Or ($findImage2 = 1)

If $findImage1 = 1 Then
	Sleep (5000)
	Send ("{enter}")
	Sleep (2000)
	Send ("123")
	Sleep (1000)
	Send ("{enter}")
	Sleep (1000)
	Send ("2009")
	Send ("{enter}")
	Sleep (20000)
	Send ("{enter}")
	Sleep (15000)
	
ElseIf $findImage2 = 1 Then
	Sleep (5000)
EndIf

WEnd
Oder alternativ so.

Code:
#include <ImageSearch.au3>

$x1 = 0
$y1 = 0

While 1
	
Do
	$findImage1 = _ImageSearch("L", 1, $x1, $y1, 0)
	Sleep(100)
Until $findImage1 = 1

If $findImage1 = 1 Then
	Sleep (5000)
	Send ("{enter}")
	Sleep (2000)
	Send ("123")
	Sleep (1000)
	Send ("{enter}")
	Sleep (1000)
	Send ("2009")
	Send ("{enter}")
	Sleep (20000)
	Send ("{enter}")
	Sleep (15000)
	
	Do
		$findImage2 = _ImageSearch("P", 1, $x1, $y1, 0)
		Sleep(100)
	Until $findImage2 = 1
	
	If $findImage2 = 1 Then
		Sleep (5000)
	EndIf
EndIf
WEnd
Ich versuchs mal anders zu erklären.
Der Bot ist für ein Game gedacht.
BILD L = Ein teil des einloggbildschirms
BILD P = Ein teil des Ingame Bildschirms

Wenn ich ingame bin ist BILD P immer vorhanden
Also würde der bot If $findImage2 = 1 Then Sleep (5000) mehrmals machen er soll es aber nur einmal machen unzwar soll er nur nach BILD P suchen wenn er bild L gefunden hatt aber er soll nachdem er BILD P gefunden hatt wieder aufhören danach zu suchen und nur wieder anfangen wenn er BILD L wieder gefunden hatt
09/19/2009 15:49 | Moep |#8
Quote:
Originally Posted by 111222333444 View Post
Ich versuchs mal anders zu erklären.
Der Bot ist für ein Game gedacht.
BILD L = Ein teil des einloggbildschirms
BILD P = Ein teil des Ingame Bildschirms

Wenn ich ingame bin ist BILD P immer vorhanden
Also würde der bot If $findImage2 = 1 Then Sleep (5000) mehrmals machen er soll es aber nur einmal machen unzwar soll er nur nach BILD P suchen wenn er bild L gefunden hatt aber er soll nachdem er BILD P gefunden hatt wieder aufhören danach zu suchen und nur wieder anfangen wenn er BILD L wieder gefunden hatt
Dieser Algorithmus würde genau dem zweiten Script von mir entsprechen...

Edit: Probier doch einfach mal das ganze mit MsgBoxen zu debuggen ;)
09/20/2009 00:17 >Trib°lex<#9
hatt jetz soweit geklappt allerdings macht der bot nur die ersten if..endif schleife aber nicht die folgenen.

Code:
#include <ImageSearch.au3>


$x1 = 0
$y1 = 0
$findImage3 = _ImageSearch("F.bmp", 1, $x1, $y1, 0)


while 1
Do
$findImage1 = _ImageSearch("L.bmp", 1, $x1, $y1, 0)
Until $findImage1 = 1

If $findImage1 = 1 Then
	MouseMove (528, 520)
	Sleep (1000)
	MouseClick ("left")
	sleep(1000)
	Send ("123456") 
	Sleep(1000)
	send ("{Enter}")
	Send ("123456") 
	Sleep(1000)
	send ("{Enter}")
EndIf
WEnd

While 2
Do
$findImage2 = _ImageSearch("C.bmp", 1, $x1, $y1, 0)
Until $findImage2 = 1

If $findImage2 = 1 Then
	send ("{Enter}")
ElseIf $findImage3 = 1 Then
	send ("{Enter}")
	send ("{Enter}")
EndIf
WEnd



While 3
do
$findImage4 = _ImageSearch("P.bmp", 1, $x1, $y1, 0)
Until $findImage4 = 1

If $findImage4 = 1 Then
$coord = PixelSearch ( 471 , 266 , 529 , 342 , 0x2A3333 )
mousemove($coord[0],$coord[1])
sleep (2000)
MouseClick ( "left" )
EndIf
WEnd
09/20/2009 10:14 | Moep |#10
Quote:
Originally Posted by 111222333444 View Post
hatt jetz soweit geklappt allerdings macht der bot nur die ersten if..endif schleife aber nicht die folgenen.

Code:
#include <ImageSearch.au3>


$x1 = 0
$y1 = 0
$findImage3 = _ImageSearch("F.bmp", 1, $x1, $y1, 0)


while 1
Do
$findImage1 = _ImageSearch("L.bmp", 1, $x1, $y1, 0)
Until $findImage1 = 1

If $findImage1 = 1 Then
	MouseMove (528, 520)
	Sleep (1000)
	MouseClick ("left")
	sleep(1000)
	Send ("123456") 
	Sleep(1000)
	send ("{Enter}")
	Send ("123456") 
	Sleep(1000)
	send ("{Enter}")
EndIf
WEnd

While 2
Do
$findImage2 = _ImageSearch("C.bmp", 1, $x1, $y1, 0)
Until $findImage2 = 1

If $findImage2 = 1 Then
	send ("{Enter}")
ElseIf $findImage3 = 1 Then
	send ("{Enter}")
	send ("{Enter}")
EndIf
WEnd



While 3
do
$findImage4 = _ImageSearch("P.bmp", 1, $x1, $y1, 0)
Until $findImage4 = 1

If $findImage4 = 1 Then
$coord = PixelSearch ( 471 , 266 , 529 , 342 , 0x2A3333 )
mousemove($coord[0],$coord[1])
sleep (2000)
MouseClick ( "left" )
EndIf
WEnd
Du hast mit "while 1" ja auch ne Schleife dessen Bedingung immer erfüllt ist. Du könntest auch schreiben "while true" oder "while 1=1". Ergo ist es eine Endlosschleife ohne Abbruchbedingung und das Script wird deshalb diese auch nie verlassen, um sich z.B. anzuschauen was in den anderen Schleifen so los ist. Um einen Schleifenabbruch zu erzwingen könntest du sie mit "exitloop" abbrechen...

Oder du benutzt einfach das Schema was ich dir in meinem zweiten Script gegeben hab. Dort wartet das Script nacheinander auf bestimmte Zustände und führt danach eine Aktion aus.

Hast du das ganze eigentlich mal mit msgboxen gedebuggt, um ein Gefühl dafür zu bekommen wie sich der code bewegt?!
09/20/2009 13:47 >Trib°lex<#11
Aber wenn ichs nach deinem zweitem schma aufbaue sucht er nur einmal danach dasheist er macht alles nur einmal er soll es aber "immer"machen.
Z.b werde ich einmal gekickt der bot logt mich wieder ein und macht das was im bot steht. dann werde ich wieder gekickt dann soll der bot mich wieder einloggen ...usw.

Die Befehle zwischen Do und Until werden ausgeführt, bis der Ausdruck wahr ist. (also nur einmal ?)


Ne hab noch keine msgbox gemacht wieso denn?
Code:
#include <ImageSearch.au3>

$x1 = 0
$y1 = 0

While 1
	
Do
	$findImage1 = _ImageSearch("L.bmp", 1, $x1, $y1, 0)
	Sleep(100)
Until $findImage1 = 1

If $findImage1 = 1 Then
    MouseMove (528, 520)
	Sleep (1000)
	MouseClick ("left")
	sleep(1000)
	Send ("123456") 
	Sleep(1000)
	send ("{Enter}")
	Send ("123123") 
	Sleep(1000)
	send ("{Enter}")
	
	Do		
		$findImage2 = _ImageSearch("C.bmp", 1, $x1, $y1, 0)
    Until $findImage2 = 1

    If $findImage2 = 1 Then
	    send ("{Enter}")
    ElseIf $findImage3 = 1 Then
	    send ("{Enter}")
	    send ("{Enter}")
	EndIf
	
	    Do
            $findImage4 = _ImageSearch("P.bmp", 1, $x1, $y1, 0)
		Until $findImage4 = 1

        If $findImage4 = 1 Then
			$coord = PixelSearch ( 471 , 266 , 529 , 342 , 0x2A3333 )
			mousemove($coord[0],$coord[1])
            sleep (2000)
            MouseClick ( "left" )
        EndIf
EndIf
WEnd
so wäre es doch richtig aber hier bei macht er auch nur das erste