PixelSearch mit Timer

  • Hi,
    ich möchte im Hintergrund ne While laufen lassen, die immer den gleichen Pixel auf dem Bildschirm anguckt und erst dann ExitLoop macht, wenn dieser Pixel sich länger als 30sek nicht mehr verändert hat. Also wenn z.B. ein Programm abstürzt und sich im Standbild keine Pixel mehr bewegen, AutoIt das Programm nach 30sek Standbild neu startet.

    Brauche einfach nur Hilfe, wie man den Timer vom Pixel abhängig macht:

    [autoit]


    While 1
    $farbe1 = PixelGetColor(100,100)
    Sleep(30000)
    $farbe2 = PixelGetColor(100,100)
    If $farbe1[0] = $farbe2[0] Then
    ExitLoop
    Else
    ContinueLoop
    EndIf
    WEnd

    [/autoit]

    Soweit wäre ich jetzt, keine Ahnung ob das funktionieren würde, so guckt er aber nur alle 30sek ob die farbe gleich ist. Würde lieber alle 500ms abgleichen und dann in Echtzeit nen 30sek-Timer hochlaufen lassen, sollte sich die Farbe nicht ändern, habe aber keine Ahnung wie das geht. Kann nur TimerDiff in Sekunden anzeigen lassen bisher:

    [autoit]


    $zeit = TimerInit()
    Sleep(30000)
    $ende = TimerDiff($zeit)
    $sekunden = $ende/1000
    $gerundet = Round($sekunden,0)

    [/autoit]
  • Mir fallen auf die Schnelle 2 Möglichkeiten ein:

    [autoit]

    $farbe = PixelGetColor(100,100)
    $count=0
    while sleep(500)
    if PixelGetColor(100,100)=$farbe then
    $count+=1
    else
    $farbe=PixelGetColor(100,100)

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

    $count=0

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

    endif
    if $count=60 then
    ExitLoop
    endif
    WEnd

    [/autoit]


    Falls nebenbei nichts anderes passieren soll. Sonst:

    [autoit]

    $farbe = PixelGetColor(100,100)
    $count=0
    AdlibRegister("_loop",500);ruft die funktion loop alle 500ms auf

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

    ;was sonst noch so passieren soll

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

    Func _loop()
    if PixelGetColor(100,100)=$farbe then
    $count+=1
    else
    $farbe=PixelGetColor(100,100)
    $count=0
    endif
    if $count=60 then
    ;hier muss rein, was dann passieren soll
    endif
    EndFunc

    [/autoit]
  • [autoit]

    $Timer = TimerInit()
    $Farbe = PixelGetColor(100, 100)

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

    While Sleep(500)
    If PixelGetColor(100, 100) <> $Farbe Then
    $Timer = TimerInit()
    $Farbe = PixelGetColor(100, 100)
    EndIf
    If TimerDiff($Timer) >= 30 * 1000 Then MsgBox(0, "", "pixel seit 30s gleich.")
    WEnd

    [/autoit]
  • Zu deinem Problem:
    Per PixelGetColor kann man unmöglich herausfinden ob ein Fenster/Programm eingefroren ist, oder nicht. Einzige Ausnahme ist ein Vollbildprogramm mit Animation an einer festdefinierten Stelle. Ich kenne nur eine Hand voll Anwendungsprogramme die dieses Kriterium erfüllen (und ich kenne ziemlich viele Programme...).

    Grund:
    Programme in einem Fenster fallen aus der Betrachtung raus, da sich hier die absolute Position der Pixel auf dem Bildschirm nicht bestimmen lässt; damit ist es auch unmöglich herauszufinden ob sich ein Pixel ändert. Da bisher noch keine Anstalten unternommen wurden auf dieses Problem aufmerksam zu machen (es ist selbstverständlich mit leichtigkeit lösbar, z.B. via WinAPI oder auch BuildIn) nehme ich an, dass es sich um ein Vollbildprogramm handelt. Vollbildprogramme sind idr (Bild, Film, Musik) Bearbeitungsprogramme, Browser (nur um die Fanatiker zu berücksichtigen die trotz 24" Monitor und doppelter HD Auflösung im Vollbildmodus unterwegs sind) oder Spiele.
    Fast alle dieser Programme besitzen keine immer sichtbare Animation (sofern keine Benutzereingaben stattfinden), außer einer großen Anzahl Spiele.

    Ich bitte darum das Problem näher zu definieren. PixelGetColor ist eine der ungeeignetesten Funktionen um herauszufinden ob ein Programm noch läuft.

    lg
    M

  • Du kannst doch bei den meisten Spielen auslesen, was sich hinter dem Button oder was auch immer steckt. Wieso arbeitest Du so nicht. Ist doch wesentlich einfacher und besonders für Dich dann leichter abzufragen.

    Oder nicht?

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl