PixelSearch - kleines Anfängerproblem

  • Hey Leute,

    so - ich hab mich mal wieder ans AutoIT gemacht, und muss sagen, ich bin wirklich begeistert. Hab gestern 4 Stunden lang an einem Skript gearbeitet und möchte dieses nun ausfeilen (es funktioniert, aber nicht so effektiv wie es funktionieren könnte).

    Es geht darum, in einer bestimmten Position zu überprüfen, ob dort ein roter Schriftzug ist.
    Da halte ich "PixelSearch" für geeignet (oder nicht)?

    Da ich hier mein eigentliches Skript nicht vorstellen brauche (geht ja nur um PixelSearch) hab ich das Help-Skript mal abgeändert.

    Hier ist es:


    $coord = PixelSearch( 750, 245, 950, 245, 0xFF0000 )
    If $coord = 0xFF0000 Then -------->>>>>>>>>> An dieser Stelle kommt es zum Problem!*
    MsgBox(0, "ROT:", $coord[0] & "," & $coord[1])
    Else
    MsgBox(0, "NICHT ROT", $coord[0] & "," & $coord[1])
    EndIf


    Eigentlich möchte ich nur überprüfen, ob $coord nun "rot" ist oder nicht. Scheint aber eine Variable zu sein, die keine "farben" annehmen kann...


    Lösung? :)


    Danke im Vorraus, AutoIT rockt!

    • Offizieller Beitrag

    Function PixelSearchReturn Value


    Success:
    Returns a two-element array of pixel's coordinates. (Array[0] =
    x, Array[1] = y)

    Failure:
    Sets @error to 1 if color is not found.


    Also sollte folgendes Funzen:

    [autoit]

    $coord = PixelSearch( 750, 245, 950, 245, 0xFF0000 )
    If Not @error then
    MsgBox(0, "ROT:", $coord[0] & "," & $coord[1])
    Else
    MsgBox(0, "NICHT ROT")
    EndIf

    [/autoit]
  • Hmm okay,
    doch vielleicht ein bisschen zu hoch für mich. Muss mich da immer eindenken und ihr postet schneller als ich denken kann.

    In meinem Skript soll es eigentlich so sein (mal in worten beschrieben):

    - Führe eine Aktion aus
    - Wiederhole genau diese Aktion, solange nichts rotes da ist
    - Wenn was rotes da ist, warte 30 Sekunden und überprüfe ob das rote noch da ist
    - wenn rot noch da, warte wieder, wenn nicht, führe aktion aus und überprüfe

    Das sind für mich zwei ineinander gebundene schleifen (klappt auch) und eben diese eine IF-Abfrage...

    Geht das denn dann überhaupt mit PixelSearch? Es geht ja nicht um die Koordinaten. Verstehe dieses @error auch nicht - hab mir die Tags inner Hilfe schon angeschaut hab aber wie gesagt wenig Erfahrung mit AutoIT - hab bisher mit PASCAL gearbeitet (auch nur im Amateur Bereich).

    Vielen Dank für Eure super schnelle Hilfe!

    • Offizieller Beitrag

    Poste mal deinen Code , so kann man nur Raten.

  • Ich habe mir erlaubt, den Code umzuformatieren, damit ich mir den besser anschaun kann ;)

    Spoiler anzeigen
    [autoit]


    HotKeySet("{END}","_exitit") ;END
    Func _exitit()
    exit 0
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 1 to 9 Step 1 ; schleife 1
    ;MouseMove(317,133)
    ;MouseDown("left")
    ;MouseUp("left")
    MouseClick("left",317,133,1,20)
    MouseMove(881,405)
    MouseDown("left")
    MouseMove(575,389)
    MouseUp("left")
    Sleep(Random (800,1000))
    Send("{BACKSPACE}")
    Sleep(Random (800,1000))
    ;MouseMove(147,133)
    ;MouseDown("left")
    ;MouseUp("left")
    MouseClick("left",147,133,1,20)
    ;MouseMove(98,370)
    ;MouseDown("left")
    ;MouseUp("left")
    MouseClick("left",98,370,1,20)
    Sleep(Random (800,1000))
    ;MouseMove(1071,283)
    ;MouseDown("left")
    ;MouseUp("left")
    MouseClick("left",1071,283,1,20)
    Sleep(Random(20,350))
    Send("3")
    Sleep(Random (1200,1500))
    Send("{ENTER}")
    Sleep(Random (1200,1500))
    Send("{ENTER}")
    Sleep(Random (1200,1500))
    Send("{ENTER}")
    Sleep(Random (1500,1700))

    For $j = 1 to 10 Step 1 ;-> diese Zahlen sind willkür, sollen ja durch die abfrage selber generiert werden / schleife2
    MouseMove(317,133)
    MouseDown("left")
    MouseUp("left")
    MouseMove(881,405)
    MouseDown("left")
    MouseMove(575,389)
    MouseUp("left")
    Sleep(Random (800,1000))
    Send("{BACKSPACE}")
    Sleep(Random (800,1000))
    MouseMove(147,133)
    MouseDown("left")
    MouseUp("left")
    Sleep(Random (800,1000))
    MouseMove(1071,283)
    MouseDown("left")
    MouseUp("left")
    Send("3")
    Sleep(Random (1200,1500))
    Send("{ENTER}")
    Sleep(Random (1200,1500))
    Send("{ENTER}")
    Sleep(Random (1200,1500))
    Send("{ENTER}")
    Sleep(Random (1500,1700))
    Next
    Sleep(Random(50000,80000))

    [/autoit] [autoit][/autoit] [autoit]

    Next
    Sleep(10)

    [/autoit] [autoit][/autoit] [autoit][/autoit]


    Sowas langes bitte immer in dern Spoiler rein! :)
    Edit: Wo ist denn da PixelGetColor ?(

  • Das soll doch bestimmt wieder ein Bot werden, oder?

    Spoiler anzeigen
    [autoit]

    ;~ - Führe eine Aktion aus
    ;~ - Wiederhole genau diese Aktion, solange nichts rotes da ist
    ;~ - Wenn was rotes da ist, warte 30 Sekunden und überprüfe ob das rote noch da ist
    ;~ - wenn rot noch da, warte wieder, wenn nicht, führe aktion aus und überprüfe

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    PixelSearch(0, 0, @DesktopWidth, @DesktopHeight, 0xFFFE98) ;deine Farbe muss hier noch rein
    If @error Then
    $time = TimerInit()
    Do
    Sleep(100)
    Until TimerDiff($time) >= 30000
    Else
    MsgBox(0, "", "Test") ;Aktion
    EndIf
    WEnd

    [/autoit]

    Meinst du so?

  • Sieht gut aus, brauche allerdings immer ein paar Minuten um zu testen ob das funktioniert.

    Was bedeutet denn Bot? Das das skript was automatisiert ist doch klar, also ist jedes Autoit Skript ein Bot.

    Kann Euch aber beruhigen, ich brauche das um Patientendaten von dem einen Fenster ins andere zu bringen. Rot wirds, wenn das Proggi die Daten nicht verarbeiten kann.
    Es handelt sich immer um einzeilige Sachen.

    Sollte ich das Proggi fertig geschrieben haben, schenke ich es meinem Vater und er spart damit nen Haufen Nerv.

    Es ist also ein Bot, aber ein lokaler.


    EDIT:

    Spoiler anzeigen

    While 1
    PixelSearch(0, 0, @DesktopWidth, @DesktopHeight, 0xFFFE98)
    If @error Then
    $time = TimerInit()
    Do
    Sleep(100)
    Until TimerDiff($time) >= 30000
    Else
    MsgBox(0, "", "Test") ;Aktion
    EndIf
    WEnd

    Jetzt ist es doch so, dass wenn es rot ist macht er weiter, oder?
    Soll aber andersrum sein. Oder bringt mich der Kaffee auf die Palme, dass ich hier garnit mehr durchblicke?

    • Offizieller Beitrag

    anno2008 in Zeile 8 muß es heißen :

    [autoit]

    If Not @error Then

    [/autoit]
  • dein script hört sich ganz gewaltig nach bot an Simmen wenn man den so anschaut


    Hilfe Hilfe nicht so schnell!

    Wie ich oben schon beschrieben hab, es ist ja auch ein Bot. Aber dafür ist AutoIT doch da oder verstehe ich da was nicht richtig? Man will doch damit Vorgänge automatisieren. Ich brauche ne halbe Stunde um die Daten zu übertragen. Allein mit meiner komischen Version die ich manuell überwachen muss spare ich Zeit ein. Außerdem bin ich wieder auf den Geschmack gekommen, Scripten macht Spaß wenn man es schafft :)


    ---

    Ich versuchs mal mit dem Not - sieht schon sehr gut aus glaube ich!!!

  • Ja, sry, dann hab ich das falsch interpretiert.

    Ich denke dann meinst du so:

    Spoiler anzeigen
    [autoit]

    _aktion()

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    PixelSearch(0, 0, @DesktopWidth, @DesktopHeight, 0xFFFE98)
    If Not @error Then
    $time = TimerInit()
    Do
    Sleep(100)
    Until TimerDiff($time) >= 30000
    Else
    _aktion()
    EndIf
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func _aktion()
    MsgBox(0, "", "Test") ;Aktion
    EndFunc ;==>_aktion

    [/autoit]

    Aber meistens ist es viel einfacher mit vorhandenen Funktionen zu arbeiten. Du kannst z.B. Text mit ControlGetText auslesen, ich denke das ist besser als Pixelsearch zu benutzen! Ich könnte mir gut vorstellen, dass es mit anderen Befehlen besser funktioniert

  • Kann der GetText auch verschiedene Fehlermeldungen auslesen?

    Sprich "Behandlung abgeschlossen."
    und "Datenbank voll." unterscheiden?

    Wobei das spielt eigentlich keine Rolle, da ich dann eh manuell die Daten abändern muss.

    Ich teste das jetzt mal und sag dann obs geklappt hat oder nicht.
    Bin allerdings nur noch ~30mins hier.
    Werde morgen eine Auszeit nehmen.
    Dann am 2. vielleicht wieder ;)

  • Ja, Fehlermeldungen kann man auslesen :)
    Wenn die Patientendaten aufgelistet sind, dann müsste man die auch da auslesen können. Oder wenn sie nicht verschlüsselt abgelegt sind, könnte man sie direkt aus der Datei rausziehen.
    Es gibt bestimmt noch einige möglichkeiten mehr, die nicht nur schneller sind, sondern auch nicht so anfällig sind wie PixelSearch ...

  • Wow, ich könnte also theoretisch eine Liste als txt abspeichern, diese laden und einzeln in mein Programm ziehen?
    Das wäre natürlich genial. Diese txt müsste dann variabel sein, da die Patientennamen/daten sich auch von Woche zu Woche ändern.

    Coole Sache, vielleicht hast Du ja Lust mir noch bissl mehr zu helfen. ICQ oder sonstiges am Start? ;)

    • Offizieller Beitrag

    Glückwunsch Anno2008 zum 500. Jubiläum :D

  • Wenn Du es aus der Gui auslesen kannst/möchtest schaue Dir AutoIt Window Info an, so erfährst Du wie die einzelnen Felder heissen.
    Dann mit GUICtrlRead() oder so auslesen und in Abfragen verbasteln

    Achtung Anfänger! :whistling:

    Betrachten des Quellcodes auf eigene Gefahr, bei Übelkeit,Erbrechen,Kopfschmerzen übernehme ich keine Haftung. 8o