Warum funktioniert GetPixelColor nicht???

  • Hallo Leute,

    Ich habe ein Verstaednisproblem:

    Ich verstehe nicht warum das nicht funktioniert........


    WinWaitActive("BlueStacks","", 1)

    #include <MsgBoxConstants.au3>


    Local $iColor = Hex(PixelGetColor(738,822,1),6)

    While $iColor <> "Hex(C9C9C7)"

    Sleep(200)

    WEnd

    MsgBox($MB_SYSTEMMODAL, "", "Die Farbe des Pixels hat sich geaendert" )


    Bitte um hilfe, ich seh den wald vor baeumen net.

    Danke

    LG

  • Hi o/
    Willkommen im Forum!

    Dein Code funktioniert nicht weil es einige Fehler beinhaltet. Wir geben hier normalerweise Hilfe zur Selbsthilfe, das bedeutet du bekommst (zumindest von mir) die grobe Richtung vorgegeben. Den Rest must du dir aber selber erschließen.

    Da es dir wahrscheinlich an Grundlagen mangelt, fangen wir doch einfach mal mit einem einfachen Fragespiel an:

    Was macht Local $iColor = Hex(PixelGetColor(738,822,1),6)?

    Was macht While $iColor <> "Hex(C9C9C7)"?

    Was ist eine While-Schleife?

    Und zu letzt: Was möchtest du eigentlich erreichen?

    Einmal editiert, zuletzt von Yjuq (9. November 2020 um 08:23)

  • Ich habe erst Gestern mit dem Programmieren angefangen....und soviel wie moeglich versucht zu lesen, in english und deutsch...meine Informatikkenntnise sind von vor 25-30 Jahren....

    Ich wollte eigentlich nur eine kleine Funktion machen, aber dann hat mich das Coden wieder erwischt...

    @Oskar: bitte sag mir wieso ich die regeln nicht beachte?

    Yjuq: Danke ich will es lernen und nicht vorgekaut bekommen!

    Was macht Local $iColor = Hex(PixelGetColor(738,822,1),6)? $iColor wird als variable verwendet und dem Wert Hex(PixelGetColor(738,822,1),6) zugeordnet. Hex(PixelGetColor) fragt den Hex Wert fuer einen definierten Pixel ab und gibt den Wert 6 stellig aus.

    Was macht While $iColor <> "Hex(C9C9C7)"? Dies soll eine Schleife beginnen, die $iColor mit dem HexWert einer bestimmten Farbe vergleicht und so lange weiter laufen soll bis die Werte uebereinstimmen, dies alle 200 ms.

    Was ist eine While-Schleife? Eine "SOLANGE DIESE KONDITION (NICHT) ERFUELLT IST , SOLANGE LAUFT DIESE FUNKTION WEITER"-Schleife.

    Das Progi soll eine Berechnung einer Datanbank ueberwachen und anhalten wenn diese Farbe erscheint. Die Datenbank gibt diese nicht als Fehler raus, aber alle Datensaetze mit dieser Farbe sind Interessant.

    Diese Schleife soll einfach "schlafen" bis diese Farbe erscheint und dann stoppen, um das Programm weiter laufen lassen.

    Mir ist nicht ganz der unterschied zur IF-THEN-Funktion klar, scheint mir das gleiche...


    Damals in Basic haette ich das so gemacht, glaube ich ....solange her...

    WinWaitActive("BlueStacks","", 1)

    #include <MsgBoxConstants.au3>


    Local $iColor = Hex(PixelGetColor(738,822,1),6)

    If $iColor <> "Hex(C9C9C7)" Then

    Sleep(200)

    goto line 8 ;(If $iColor<>"Hex(C9C9C7)" Then

    Else

    EndIf

    MsgBox($MB_SYSTEMMODAL, "", "Die Farbe des Pixels hat sich geaendert" )


    Kann mich jemand in die richtige Richtung dirigieren?

    Danke das es dieses Forum gibt!!!

    Beste Gruesse

    • Offizieller Beitrag

    dask

    Oscars Hinweis auf die Forenregeln bezieht sich sicher auf das Fenster, welches du überwachst. "BlueStacks" ist ein Emulator und wird vorrangig für Spiele genutzt. Und deren Automatisierung verstößt gegen unsere Forenregeln.

    Sei deshalb bei Anfragen so konkret wie möglich und benenne immer Roß und Reiter.

  • Die TabelenkalculationsApp ist in meinem Samsung Android Phone und nur so kann ich das auf dem pc emulieren. Ich hab versucht als excell zu speichen aber das geht nicht.

    Wie gesagt hab ich erst gestern Autoit gefunden und zu erwarten, das ich als gruenschnabel Spiele manipolieren moechte amuesiert mich, ist eigentlich sogar ein Kompliment, das anzunehmen. ICh weiss noch nicht mal was das fuer eine Sprache ist...lol

    In der Schule hatte ich mit Basic, Logo, Pascal zutun....ein viertel jahrhundert ist es her...lol

    Ich habe die Freude, die es macht wenn ein selbst geschriebens Proggi funktioniert, wiederendeckt und will in diesem konkreten Fall einfach mal lernen wo mein(e) Fehler ist/sind.


    LG aus Kanada

  • Ok, ich glaube Dir mal, dass es nicht um Spieleautomation geht ;).

    Versuche :

    EDIT : Es gibt andere (bessere) Wege, aber bleiben wir vorerst bei Deinem Beispiel. Die Fehler in Deinem Skript können wir später durchgehen.

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Hi dask,

    dein genereller Fehler im Script war/ist, dass du innerhalb deiner While-Schleife die Variable $iColor nie neu abgefragt, also einen (bei Änderung des "Pixels") neuen Wert zugewiesen hast.

    Musashi hat die Schleife schön zusammengefasst, aber um bei deinem Eingangspost zu bleiben hättest du nur eine Zeile verschieben müssen^^

    statt

    Code
    Local $iColor = Hex(PixelGetColor(738,822,1),6)
    
    
    While $iColor <> "Hex(C9C9C7)"
    
    Sleep(200)
    
    WEnd

    hättest du damit bereits ein Ergebnis bekommen

    Code
    While $iColor <> "Hex(C9C9C7)"
    
    Local $iColor = Hex(PixelGetColor(738,822,1),6)
    
    Sleep(200)
    
    WEnd

    OFFTOPIC

    In der Schule hatte ich mit Basic, Logo, Pascal zutun....ein viertel jahrhundert ist es her...lol

    hehe, da könne der ein oder andere hier im Forum noch 10 bis 15 Jahre drauflegen...

    https://de.wikipedia.org/wiki/Apple_Lisa <-- 6 solcher Maschinen hatten wir damals in der Schule (man beachte den damaligen Preis)......und heutzutage wird rumdiskutiert, jedem Schüler ein Tablet zur Verfügung zu stellen...

  • Musashi - Ich denke eine vorgefertigte Lösung zu präsentieren hilft nicht wirklich. Ich bleibe mal bei meiner Vorrangehensweise und erkläre ihm lieber wo seine Fehler sind. Alles andere macht für mich keinen Sinn.

    dask - Deine Antworten sind zumindest schon einmal nicht schlecht. Ich habe dir die Fragen gestellt um selber erst mal zu sehen ob du auch selber verstehst was du da gepostet hast. Prinzipiell scheinst du ja schon mal gewisse Grundlogik und ein allgemeines Verständnis von Progammabläufen zu haben. Sprich: Geordnete Gedankengänge von "Was will ich erreichen?" zu "Wie setze ich das um?". Das ist schon einmal eine gute Vorraussetzung. Nun zu deinen Fehlern die du mit dem Skript gepostet hast.

    Frage 1:

    Das ist soweit korrekt. Diese Zeile macht auch genau das, was du beschrieben hast.

    Frage 2:

    Das ist prinzipiell auch korrekt. Zumindest wenn es um die Logik dahinter geht. Jedoch ist das nicht korrekt umgesetzt. In der Programmierung existieren Strings. Strings sind auf gut Deutsch eigenlich nur Zeichenketten. In AutoIt werden Strings üblicherweise in " oder ' Zeichen verpackt. Was du tatsächlich abfragst ist Folgendes: Ist $iColor nicht gleich der Zeichenkette "Hex(C9C9C7)"? Du fragst hier nach der Zeichenkette ab, nicht nach dem Hexwert C9C9C7. Das ist schon ein Fehler. Was du eigentlich machen möchtest ist das hier: $iColor <> 0xc9c9c7

    Um einen Hexdezimalen Wert in AutoIt darzustellen, kannst du einfach 0x vorne heran fügen. Die Funktion Hex() gibt dir den Hexdezimalen Wert einer Dezimalzahl zurück. Konvertiert also von Dezimalsystem zu Hexdezimalsystem. Der Rückgabewert ist allerdings ebenfalls ein String. AutoIt ist sehr freundlich was Datentypen angeht, meistens jedenfalls. Bedeutet dass "123" und 123 für AutoIt in Vergleichen das Selbe ist.

    Hex() - Dokumentation

    Frage 3:

    Das Grundprinzip von Schleifen scheinst du zu kennen. Die Formulierung ist etwas üppig und nicht wirklich korrekt, aber ich sehe was du damit ausdrücken möchtest. Vom Sinn her ist das richtig.

    ---

    Nun kommt der Knackpunkt in deinem Skript. Du fragst lediglich einmalig ab, welche Farbe an der Koordinate (738 | 822) befindet. Diese Farbe wird in $iColor gespeichert. Danach überprüfst du ob sich $iColor irgendwann einmal verändert. Das Problem ist allerdings, du fragst niemals nochmal nach der Farbe an besagter Koordinate. Heißt, dein $iColor bleibt immer gleich und deine Abfrage in der While-Schleife gibt demnach immer das Selbe Ergebnis zurück. Um das zu umgehen musst du $iColor in der While-Schleife aktuallisieren.

    ---

    Andy - Tja, da warst du mal wieder schneller... x)

  • Musashi hi, erst mal danke! Das funktionert und ist sehr elegant (finde ich) mit dem ESC!!!

    Ich wuerde gerne mehr ueber die Fehler, die drin hab, lernen!

    Das ist interessant, d.h. man muss alles als variablen vordeklarieren, ich hatte angenommen das waere mehr autark.

    Ich dachte, das waere das gleiche:

    Hex(PixelGetColor($iPosX, $iPosY), 6) <> $sSearchColor

    und

    Local $iColor = Hex(PixelGetColor(738,822,1),6)

    While $iColor <> "Hex(C9C9C7)"

    und

    Hex(PixelGetColor(738,822,1),6) <> "Hex(C9C9C7)"

    Also war mein Fehler das nicht alles zu deklarieren???

    Desweiteren sind mir die Begriffe (noch) nicht bekannt:

    BitOR

    @CLRF

    Gibt es irgendwo ein Kompendium? Die Offlinehilfe ist gut, aber eher orientiert an Leuten die das schon wissen und nur mal eben nachsehen wollen.

    Ich braeuchte ehe was, das mir die Sachen erklaert. Siehe Z.B. die Funktionsreferenz von BitOR, da steht nirgents erkaert was das macht oder ist, ausser das es eine BitWeise OR operation durchfuehrt. Das erklaert mir garnix....


    ______________________________________________________________________________

    Funktionreferenz

    BitOR

    Führt eine Bitweise OR Operation durch.

    BitOR ( value1, value2 [, value n] )

    Parameter

    Funktion BitOR
    value1 Die erste Zahl. value2 Die zweite Zahl. value n [optional] Die n-te Zahl - bis zu 255 Werte können festgelegt werden. Rückgabewert


    Gibt den Wert für das Bitweise OR der Parameter zusammen aus.

    Bit Operationen werden als 32-bit Integer ausgeführt.

    Bemerkungen

    Es können auch HEX-Ausdrücke als Parameter verwendet werden.

    BitOR() gibt 0 für jede Bitposition an der alle Argumente eine 0 an korrespondierender

    Position haben und 1 wann immer dort ein 1-er Bit vorhanden ist.

    Verwandte Funktionen

    BitAND, BitNOT, BitRotate, BitShift, BitXOR, Hex

    Beispiel

    ...______________________________________________________________________________

    Ich versteh den Hinweis mit Spielautomaten nicht?!?

    Wie soll so etwas in einen Einarmigenbanditen reinkommen???

    Ich bin noch nie in einem Casino gewesen...


    Danke auf jeden fall

    LG Micha

  • Den Kommentar zu der "Spieleautomation" oder wie du es nanntest "Spielautomaten" bezieht sich auf Programme, welche darauf abziehlen Computerspiele zu automatisieren. Dies widerspricht den Forenregeln und wird hier nicht geduldet. Das hat nichts mit einem Casino zu tun. ^^

    Die Dokumentationen sind manchmal schwer zu verstehen wenn man den Sinn hinter einigen Sachen nicht kennt oder Vergleichsbeispiele hat. Weißt du was über Elektrotechnik und wie Logic-Gates funktionieren? Diese Bit-Funktionen machen genau das Selbe, lediglich mit mehreren "Signalen" gleichzeitig. Du kannst dich ja mal ein wenig hier durchwühlen: Logic Gates

    Es gab da auch eine gute Deutsche Seite über Elektrotechnik. Aber mir fällt der Name nicht mehr ein... Sorry

  • Danke fuer die Antworten !!!

    Hab die erst gesehen nachdem ich Musashi geantwortret habe.

    Erst mal sorry wenn mein deutsch etwas komisch klingt.... ich lebe seit 10 Jahren in Uebersee und hab nur sehr selten die moeglichkeit deutsch zu sprechen, noch seltener zu schreiben. Ich hab nicht mal ne deutsche tastatur...lol (ich weis ich koennte das umstellen, aber glaubt mir das macht alles nur schlimmer...ich nenne das dann Tastenraten...lol)

    Also nochmal danke fuer Euer Feedback!

    LG Micha

  • Wenn du Probleme mit Deutsch hast: Ich bin auch der englischen Sprache mächtig, falls das für dich angenehmer ist. Du darfst mir auch gerne private Nachrichten über das Forum schreiben. Ich antworte sobald ich diese sehe. Bin aber eher einer der mehr inaktiven Mitglieder hier. Ich brauch AutoIt nicht mehr so häufig wie ich es mal gebraucht hatte.

  • Musashi - Ich denke eine vorgefertigte Lösung zu präsentieren hilft nicht wirklich.

    Grundsätzlich gebe ich Dir recht. Da das Skript aber recht überschaubar ist bestand mein Ansatz darin, dass dask bei der Analyse der Lösung seine Fehler selbst erkennt oder ggf. nachfragt.

    Auf einige Knackpunkte hattest Du ihn bereits hingewiesen.

    Ansonsten haben Du und Andy ja nachfolgend alles sehr ausführlich erklärt.

    Also war mein Fehler das nicht alles zu deklarieren???

    Nein, es ist nicht zwingend erforderlich Variablen zu deklarieren (außer Du stellst diese Option ein), aber empfehlenswert. Siehe dazu AutoItSetOption (Option : MustDeclareVars).

    Zu @CRLF :

    Das ist ein sogenanntes Makro, siehe : Makroreferenz . Dort findest Du auch andere, nützliche Makros.

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."