Pixelsearch Fenster zuweisen?

07/03/2013 17:45 BOTCK#1
Hallo,

gibt es bei Pixelsearch die Möglichkeit die Suche auf ein bestimmtes Fenster zu beschränken, wobei das Fenster dabei nicht im Vordergrund sein muss?

Laut der Dokumentation von Pixelsearch kann man doch nur ganz allgemein die x1,x2,y1,y2 Koordinaten für die Suche eingeben oder?
07/03/2013 17:48 qkuh#2
Ja stimmt, du könntest mit PixelGetColor arbeiten, wenn dir das reicht.
07/03/2013 17:50 YatoDev#3
AutoIt Hilfe :

Code:
PixelSearch ( left, top, right, bottom, color [, shade-variation [, step [, [SIZE="5"][B][COLOR="Red"]hwnd[/COLOR][/B][/SIZE]]]])
07/03/2013 17:52 Fl00d3R#4
Die Anfänger sind los!

Code:
[URL="http://www.autoitscript.com/autoit3/docs/keywords.htm"][COLOR=#0000FF][B]Func[/B][/COLOR][/URL] _Start[COLOR=#FF0000][B]([/B][/COLOR][COLOR=#FF0000][B])[/B][/COLOR]     [URL="http://www.autoitscript.com/autoit3/docs/keywords.htm"][COLOR=#0000FF][B]While[/B][/COLOR][/URL] [COLOR=#AC00A9][B][I]1[/I][/B][/COLOR]
        [URL="http://www.autoitscript.com/autoit3/docs/intro/lang_variables.htm"][COLOR=#AA0000][B]$koord[/B][/COLOR][/URL][COLOR=#0000FF][B][/B][/COLOR] [COLOR=#FF0000][B]=[/B][/COLOR] [URL="http://www.autoitscript.com/autoit3/docs/functions/WinGetPos.htm"][COLOR=#000090][B][I]WinGetPos[/I][/B][/COLOR][/URL][COLOR=#FF0000][B]([/B][/COLOR][COLOR=#9999CC][B]"Fenstername deines Programms"[/B][/COLOR][COLOR=#FF0000][B])[/B][/COLOR]         [URL="http://www.autoitscript.com/autoit3/docs/keywords.htm"][COLOR=#0000FF][B]If[/B][/COLOR][/URL] [URL="http://www.autoitscript.com/autoit3/docs/macros.htm"][COLOR=#FF33FF][B]@error[/B][/COLOR][/URL] [URL="http://www.autoitscript.com/autoit3/docs/keywords.htm"][COLOR=#0000FF][B]Then[/B][/COLOR][/URL] _pause[COLOR=#FF0000][B]([/B][/COLOR][COLOR=#FF0000][B])[/B][/COLOR]         [URL="http://www.autoitscript.com/autoit3/docs/intro/lang_variables.htm"][COLOR=#AA0000][B]$Pixel[/B][/COLOR][/URL][COLOR=#0000FF][B][/B][/COLOR] [COLOR=#FF0000][B]=[/B][/COLOR] [URL="http://www.autoitscript.com/autoit3/docs/functions/PixelSearch.htm"][COLOR=#000090][B][I]PixelSearch[/I][/B][/COLOR][/URL][COLOR=#FF0000][B]([/B][/COLOR][URL="http://www.autoitscript.com/autoit3/docs/intro/lang_variables.htm"][COLOR=#AA0000][B]$koord[/B][/COLOR][/URL][COLOR=#0000FF][B][/B][/COLOR][COLOR=#FF0000][B][[/B][/COLOR][COLOR=#AC00A9][B][I]0[/I][/B][/COLOR][COLOR=#FF0000][B]][/B][/COLOR][COLOR=#FF0000][B],[/B][/COLOR][URL="http://www.autoitscript.com/autoit3/docs/intro/lang_variables.htm"][COLOR=#AA0000][B]$koord[/B][/COLOR][/URL][COLOR=#0000FF][B][/B][/COLOR][COLOR=#FF0000][B][[/B][/COLOR][COLOR=#AC00A9][B][I]1[/I][/B][/COLOR][COLOR=#FF0000][B]][/B][/COLOR][COLOR=#FF0000][B],[/B][/COLOR][URL="http://www.autoitscript.com/autoit3/docs/intro/lang_variables.htm"][COLOR=#AA0000][B]$koord[/B][/COLOR][/URL][COLOR=#0000FF][B][/B][/COLOR][COLOR=#FF0000][B][[/B][/COLOR][COLOR=#AC00A9][B][I]0[/I][/B][/COLOR][COLOR=#FF0000][B]][/B][/COLOR][COLOR=#FF0000][B]+[/B][/COLOR][URL="http://www.autoitscript.com/autoit3/docs/intro/lang_variables.htm"][COLOR=#AA0000][B]$koord[/B][/COLOR][/URL][COLOR=#0000FF][B][/B][/COLOR][COLOR=#FF0000][B][[/B][/COLOR][COLOR=#AC00A9][B][I]2[/I][/B][/COLOR][COLOR=#FF0000][B]][/B][/COLOR][COLOR=#FF0000][B],[/B][/COLOR][URL="http://www.autoitscript.com/autoit3/docs/intro/lang_variables.htm"][COLOR=#AA0000][B]$koord[/B][/COLOR][/URL][COLOR=#0000FF][B][/B][/COLOR][COLOR=#FF0000][B][[/B][/COLOR][COLOR=#AC00A9][B][I]1[/I][/B][/COLOR][COLOR=#FF0000][B]][/B][/COLOR][COLOR=#FF0000][B]+[/B][/COLOR][URL="http://www.autoitscript.com/autoit3/docs/intro/lang_variables.htm"][COLOR=#AA0000][B]$koord[/B][/COLOR][/URL][COLOR=#0000FF][B][/B][/COLOR][COLOR=#FF0000][B][[/B][/COLOR][COLOR=#AC00A9][B][I]3[/I][/B][/COLOR][COLOR=#FF0000][B]][/B][/COLOR][COLOR=#FF0000][B],[/B][/COLOR][COLOR=#AC00A9][B][I]0xA70811[/I][/B][/COLOR][COLOR=#FF0000][B])[/B][/COLOR]         [URL="http://www.autoitscript.com/autoit3/docs/keywords.htm"][COLOR=#0000FF][B]If[/B][/COLOR][/URL] [URL="http://www.autoitscript.com/autoit3/docs/keywords.htm"][COLOR=#0000FF][B][/B][/COLOR][/URL][URL="http://www.autoitscript.com/autoit3/docs/intro/lang_operators.htm"][COLOR=#FF0000][B]Not[/B][/COLOR][/URL] [URL="http://www.autoitscript.com/autoit3/docs/macros.htm"][COLOR=#FF33FF][B]@error[/B][/COLOR][/URL] [URL="http://www.autoitscript.com/autoit3/docs/keywords.htm"][COLOR=#0000FF][B]Then[/B][/COLOR][/URL]             [URL="http://www.autoitscript.com/autoit3/docs/functions/MouseClick.htm"][COLOR=#000090][B][I]MouseClick[/I][/B][/COLOR][/URL][COLOR=#FF0000][B]([/B][/COLOR][COLOR=#9999CC][B]"left"[/B][/COLOR][COLOR=#FF0000][B],[/B][/COLOR][URL="http://www.autoitscript.com/autoit3/docs/intro/lang_variables.htm"][COLOR=#AA0000][B]$Pixel[/B][/COLOR][/URL][COLOR=#0000FF][B][/B][/COLOR][COLOR=#FF0000][B][[/B][/COLOR][COLOR=#AC00A9][B][I]0[/I][/B][/COLOR][COLOR=#FF0000][B]][/B][/COLOR][COLOR=#FF0000][B]+[/B][/COLOR][COLOR=#AC00A9][B][I]5[/I][/B][/COLOR][COLOR=#FF0000][B],[/B][/COLOR][URL="http://www.autoitscript.com/autoit3/docs/intro/lang_variables.htm"][COLOR=#AA0000][B]$Pixel[/B][/COLOR][/URL][COLOR=#0000FF][B][/B][/COLOR][COLOR=#FF0000][B][[/B][/COLOR][COLOR=#AC00A9][B][I]1[/I][/B][/COLOR][COLOR=#FF0000][B]][/B][/COLOR][COLOR=#FF0000][B]+[/B][/COLOR][COLOR=#AC00A9][B][I]10[/I][/B][/COLOR][COLOR=#FF0000][B])[/B][/COLOR]         [URL="http://www.autoitscript.com/autoit3/docs/keywords.htm"][COLOR=#0000FF][B]Else[/B][/COLOR][/URL]             [URL="http://www.autoitscript.com/autoit3/docs/functions/MsgBox.htm"][COLOR=#000090][B][I]MsgBox[/I][/B][/COLOR][/URL][COLOR=#FF0000][B]([/B][/COLOR][COLOR=#AC00A9][B][I]4096[/I][/B][/COLOR][COLOR=#FF0000][B],[/B][/COLOR][COLOR=#9999CC][B]"ERROR"[/B][/COLOR][COLOR=#FF0000][B],[/B][/COLOR][COLOR=#9999CC][B]"Kein Pixel gefunden"[/B][/COLOR][COLOR=#FF0000][B],[/B][/COLOR][COLOR=#AC00A9][B][I]2[/I][/B][/COLOR][COLOR=#FF0000][B])[/B][/COLOR]         [URL="http://www.autoitscript.com/autoit3/docs/keywords.htm"][COLOR=#0000FF][B]EndIf[/B][/COLOR][/URL]     [URL="http://www.autoitscript.com/autoit3/docs/keywords.htm"][COLOR=#0000FF][B]WEnd[/B][/COLOR][/URL]  [URL="http://www.autoitscript.com/autoit3/docs/keywords.htm"][COLOR=#0000FF][B]EndFunc[/B][/COLOR][/URL]
[URL="http://www.autoitscript.com/autoit3/docs/keywords.htm"][COLOR=#0000FF][B]Func[/B][/COLOR][/URL] _Ende [COLOR=#FF0000][B]([/B][/COLOR][COLOR=#FF0000][B])[/B][/COLOR]     [URL="http://www.autoitscript.com/autoit3/docs/keywords.htm"][COLOR=#0000FF][B]Exit[/B][/COLOR][/URL] [URL="http://www.autoitscript.com/autoit3/docs/keywords.htm"][COLOR=#0000FF][B]EndFunc[/B][/COLOR][/URL]
[URL="http://www.autoitscript.com/autoit3/docs/keywords.htm"][COLOR=#0000FF][B]Func[/B][/COLOR][/URL] _pause[COLOR=#FF0000][B]([/B][/COLOR][COLOR=#FF0000][B])[/B][/COLOR]     [URL="http://www.autoitscript.com/autoit3/docs/keywords.htm"][COLOR=#0000FF][B]While[/B][/COLOR][/URL] [URL="http://www.autoitscript.com/autoit3/docs/keywords.htm"][COLOR=#0000FF][B][/B][/COLOR][/URL][URL="http://www.autoitscript.com/autoit3/docs/intro/lang_operators.htm"][COLOR=#FF0000][B]Not[/B][/COLOR][/URL] [URL="http://www.autoitscript.com/autoit3/docs/functions/WinExists.htm"][COLOR=#000090][B][I]WinExists[/I][/B][/COLOR][/URL][COLOR=#FF0000][B]([/B][/COLOR][COLOR=#9999CC][B]"Programm"[/B][/COLOR][COLOR=#FF0000][B])[/B][/COLOR]         [URL="http://www.autoitscript.com/autoit3/docs/functions/Sleep.htm"][COLOR=#000090][B][I]Sleep[/I][/B][/COLOR][/URL][COLOR=#FF0000][B]([/B][/COLOR][COLOR=#AC00A9][B][I]100[/I][/B][/COLOR][COLOR=#FF0000][B])[/B][/COLOR]     [URL="http://www.autoitscript.com/autoit3/docs/keywords.htm"][COLOR=#0000FF][B]WEnd[/B][/COLOR][/URL] [URL="http://www.autoitscript.com/autoit3/docs/keywords.htm"][COLOR=#0000FF][B]EndFunc[/B][/COLOR][/URL]
Bei Fragen bitte melden.

LG Fl00d3R
07/03/2013 18:07 BOTCK#5
@FlutterShy Den Hwend Parameter hab ich zwar gesehn, aber den versteh ich nicht - wie errechne ich den ? Und was macht er genau?

@Fl00d3R dazu musst das Fenster nicht im Vordergrund laufen?
07/03/2013 19:05 Croco™#6
Dieser Parameter benötigt eine Fenster Handle das man durch WinGetHandle erhält.
Heißt das Fenster 'Ich bin ein Fenster' dann bekommst du sein Handle durch
WinGetHandle('Ich bin ein Fenster').
07/03/2013 19:29 YatoDev#7
Quote:
Originally Posted by BOTCK View Post
@FlutterShy Den Hwend Parameter hab ich zwar gesehn, aber den versteh ich nicht - wie errechne ich den ? Und was macht er genau?

@Fl00d3R dazu musst das Fenster nicht im Vordergrund laufen?
Das handle (die HWND [Hardware number oder sowas ] )
Code:
$Window = WinGetTitle("Fenstername/teil des fensternamens)
$HWND = WinGetHandle($Window)
07/03/2013 19:42 BOTCK#8
Hm also kommen direkt nach
Func Start()
$Window = WinGetTitle("FirefoxalsBeispiel")
$HWND = WinGetHandle($Window)

( ich deklarier am Anfang Global $Window=0 und $HWND =0)

und PixelSearch ( left, top, right, bottom, color [, shade-variation [, step [, hwnd]]])

würde ich dann statt hwnd einfach $HWND eintragen? Wieso klappt das bei mir nicht?
07/03/2013 20:01 Croco™#9
Poste doch mal bitte dein Script die Kristallkugel von uns ist nämlich gerade kaputt.
07/03/2013 20:18 BOTCK#10
ich hab mal den relevanten Teil raus:

Global $funcs = false
$Left = "left"

Func Start()
$funcs = True
EndFunc

Func Pause()
$funcs = False
while $funcs = False
sleeP(500)
WEnd
EndFunc

Func Ende()
Exit
EndFunc

while 1
if $funcs = True then
$pixrand = PixelSearch(1000,100,1100,120,0xFFF00,7, 2)

If IsArray($pixrand) = True Then
MouseClick($Left, $pixrand[0], $pixrand[1], 1, 0)
EndIf
Wend


Und ich würde gerne den Pixelsearch im aktiven Fenster laufen lassen.
07/03/2013 20:35 Croco™#11
Code:
PixelSearch(1000,100,1100,120,0xFFF00,7, 2,WinGetHandle("[active]"))
Sucht immer im aktiven Fenster.
07/03/2013 20:56 BOTCK#12
Und wenn ich jetzt in deinem bestimmten Fenster den Script laufen lassen will, was ändere ich dann bzw. wieso funktioniert das überhaupt ? "WinGetHandle" wurde doch von mir garnicht definiert?

(Und bringt es überhaupt was - wenn ich alle Funktionen so code, dass sie in einem bestimmten Fenster laufen - also MouseMove etc. kann ich dann an dem Pc normal arbeiten, oder darf ich auch dann die Maus nicht anfassen?)
07/03/2013 21:51 Croco™#13
Nein, [active] ist kein Fenstertitel sondern ein vordefinierter Begriff der der Funktion WinGetHandel sagt dass es immer den Handel vom Aktiven Fenster zurück geben soll.
MouseMove ändert die Position deines Mauszeigers also darfst du ihn nicht bewegen.
07/03/2013 22:03 BOTCK#14
achso ok, dann ist es ohnehin nutzlos, ob das Script dann im aktiven Fenster oder im Hintergrund ausgeführt wird, solange ich nicht nebenher arbeiten kann.
07/03/2013 22:18 KDeluxe#15
Quote:
Originally Posted by »FlutterShy™ View Post
Das handle (die HWND [Hardware number oder sowas ] )
Handle (of a) WiNDow → window handle
Nichts mit Hardware.

Quote:
Originally Posted by BOTCK View Post
Und wenn ich jetzt in deinem bestimmten Fenster den Script laufen lassen will, was ändere ich dann bzw. wieso funktioniert das überhaupt ? "WinGetHandle" wurde doch von mir garnicht definiert?

(Und bringt es überhaupt was - wenn ich alle Funktionen so code, dass sie in einem bestimmten Fenster laufen - also MouseMove etc. kann ich dann an dem Pc normal arbeiten, oder darf ich auch dann die Maus nicht anfassen?)
WinGetHandle() ist eine Standardfunktion von AutoIt. Das Handle eines Fensters an eine Funktion zu übergeben macht unmögliches nicht möglich. PixelSearch() funktioniert ähnlich wie das menschliche Auge. Was das Script bzw. die Funktion nicht "sieht" kann schlicht und ergreifend nicht gefunden bzw. erfasst werden.
Fragst du dich jetzt, wofür dieser Parameter gut ist? Ganz einfach: Die Koordinaten erfolgen relativ zum jeweiligen Fenster und nicht über den Desktop. Du kannst das Fenster also frei bewegen ohne die Funktionalität deines Scripts zu beeinträchtigen.
Das setzt natürlich zwei Dinge voraus:
  1. Alle verwendeten Funktionen müssen mit den Fenster-Koordinaten arbeiten können. Ein normales MouseMove() oder MouseClick() wird hier nicht funktionieren.
  2. Der Arbeitsbereich (Fenster) MUSS sichtbar sein.

Das aktive ("[active]") Fenster kann logischerweise nicht im Hintergrund laufen, da sich diese zwei Zustände ausschließen.
Wie Croco™ schon geschrieben hat kannst du MouseMove() nicht im "Hintergrund" laufen lassen. Selbiges gilt für alle Mouse...() Funktionen.
Alternativ dazu kannst du allerdings ControlClick() (AutoIt Standardfunktion) oder PostMessage (AutoIt UDF von mir, findest du in diesem Forum) verwenden. Hier musst du allerdings beachten, dass dies nicht immer ohne weiteres möglich ist. Bei "modernen" Client basierenden Spielen funktionieren diese meist nur eingeschränkt oder gar nicht.


Um die Grundlegende Frage zu klären:
Ja, es ist bedingt möglich PixelSearch() im "Hintergrund" laufen zu lassen. Bedingt und Hintergrund in Anführungszeichen daher, da dass Fenster immer noch frei sichtbar sein muss. Sollten Aktionen mit der Maus ausgeführt werden, so musst du auf ControlClick() oder die PostMessage Funktion zurückgreifen. Bei Aktionen der Tastatur wäre es ControlSend() oder ebenfalls die PostMessage Funktion.
Hier ist es eigentlich nur eine Frage der Hardware, ich persönlich verwende drei Monitore, einen zu "opfern" tut nicht weh. Notebooks können häufig nur zwei Monitore ansteuern und sollte zudem ein zusätzlicher Monitor fehlen ist das ganze schon problematischer.
Je nach verbauter Hardware und Verwendungszweck wäre es auch möglich das Programm in einer virtuellen Maschine ausführen zu lassen. Diese kann selbst dann noch minimiert im Hintergrund laufen, wenn du MouseMove(), -Click() oder vergleichbares verwendest. Aber das hat nichts mehr mit AutoIt zu tun.