Habe mein Problem gefunden. Musste die Zeile auf If $iAlarmCounter <> 2 Then ändern, dann läuft das auch rein, wenn $iAlarmCounter = 1 ist. Frage ich eigentlich den @error falsch ab? Der GUISetState geht jetzt, aber bei der Zeile ConsoleWrite("Rückgabe von @error nachdem GUI aktualisiert wurde: " & @error & @CRLF & @CRLF) bekomme ich immer noch eine 0 als Ergebnis. Laut Hilfe ist aber 0 = Fehler.
Beiträge von Code4Fun
-
-
Den Toleranzpart habe ich mal eingebaut. Der scheint auch zu funktionieren. Den Teil mit den "anderen" Farben muss ich noch machen. Aktuell habe ich das Problem, das sich meine GUI in Zeile 157 nicht aktualisiert. Zeile 158 protokolliert eine "0". Das versteht ich jetzt nicht ganz.
Code
Python
Alles anzeigen#include <GUIConstantsEx.au3> #include <MsgBoxConstants.au3> #include <Sound.au3> #include <TrayConstants.au3> ; mit der While Wend Schleife stimmt noch was nicht. checken. #Region ;**** Directives created by AutoIt3Wrapper_GUI **** #AutoIt3Wrapper_Change2CUI=y #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI **** #Region ; mögliche Includes einbinden, bzw. nur die notwendigen einbinden. #include <MsgBoxConstants.au3> #include <TrayConstants.au3> #include <Sound.au3> #include <GUIConstantsEx.au3> #EndRegion ; mögliche Includes einbinden, bzw. nur die notwendigen einbinden. #Region ; Script Kopf #cs ---------------------------------------------------------------------------- AutoIt Version: 3.3.14.5 Author: Code4Fun Script Function: Das Script scannt einen bestimmten Bereich auf dem Monitor. Dieser Bereich zeigt ein webbasiertes Servermonitoring. Im Normalfall ist dort die Farbe grün = OK Wenn es auf orange oder rot wechselt, soll dieses Script hier später einen aktustischen Alarm auslösen. Erstellungendatum: vom 25.04.2019 Änderungsdatum: Version: 0.0.1.0 History: 0.0.1: Initialerstellung #ce ---------------------------------------------------------------------------- #EndRegion ; Script Kopf #Region ; AutoIt-Spezifischen Optionen Opt("GUICloseOnESC", 1) ; Wenn man die ESC Taste drückt, wird die GUI geschlossen, da eine $GUI_EVENT_CLOSE Nachricht gesendet wird Opt("MustDeclareVars", 1) ; Variablen (Dim / Global / Local / Const) müssen deklariert sein. Wichtig für Fehlersuche Opt("TrayIconDebug", 1) ; Zeigt die aktuelle Skriptzeile im Trayicon Tipp um das Debugging zu unterstützen Global $exititem, $sFarbe, $hGUI, $idButton, $sLocation, $sLabel Global $iAlarmCounter = 0 #EndRegion ; AutoIt-Spezifischen Optionen AdlibRegister(_PixelbereichScannen, 3000) ; alle x Sekunden wird diese Funktion aufgerufen. ;Tray-Menü anpassen Opt("TrayAutoPause", 0) ; Script will not be paused when clicking the tray icon. Opt("TrayOnEventMode", 1) Opt("TrayMenuMode", 1 + 2) $exititem = TrayCreateItem("Beenden") TrayItemSetState(-1, $TRAY_UNCHECKED) TrayItemSetOnEvent(-1, "_Exit") TraySetState() #Region ; GUI Erstellung - nur ein erstes Beispiel $hGUI = GUICreate("A L A R M", @DesktopWidth - 100, @DesktopHeight - 100, -1, -1, 0x0) ; erstelle die GUI $sLabel = GUICtrlCreateLabel("KEIN ALARM", 600, 100, 600, 200) ; schreibe diesen Text als Label GUICtrlSetFont($sLabel, 50, 900) ; setze den Font $idButton = GUICtrlCreateButton("OK", 700, 400, 150, 150) ; erstelle OK Button. GUICtrlSetFont($idButton, 50, 900) ; setze den Font GUISetState(@SW_HIDE, $hGUI) ; verstecke die GUI #EndRegion ; GUI Erstellung - nur ein erstes Beispiel #Region ; Hauptschleife While 1 Switch GUIGetMsg() Case $GUI_EVENT_CLOSE ExitLoop Case $idButton ; wenn OK Button gedrückt wird .. _OKpressed() EndSwitch WEnd #EndRegion ; Hauptschleife #Region ; Funktionen Func _PixelbereichScannen($sLocation) ConsoleWrite("Funktion _PixelbereichScannen Anfang" & @CRLF) Local $aCoord ; Wenn in den unten stehenden Koordinaten die Farbe grün (0x53A000) zu finden ist, ist alles OK ConsoleWrite("$sLocation ist: " & $sLocation & @CRLF) If $sLocation = "GP" Then $aCoord = PixelSearch(-2833, 835, -2771, 872, 0x53A000, 50, 3) Else $aCoord = PixelSearch(-1225, 820, -1146, 866, 0x53A000, 50, 3) EndIf If Not @error Then ; wenn alles OK ist dann $iAlarmCounter = 0 ; setze Counter wieder zurück auf 0 ConsoleWrite("$iAlarmCounter ist: " & $iAlarmCounter & @CRLF) Else ;ConsoleWrite("Kein Treffer bei OK" & @CRLF) EndIf ; Wenn in den unten stehenden Koordinaten die Farbe orange (0xFAA732) zu finden ist, ist Warnstufe 1 angesagt If $sLocation = "GP" Then $aCoord = PixelSearch(-2833, 835, -2771, 872, 0xFAA732, 50, 3) Else $aCoord = PixelSearch(-1225, 820, -1146, 866, 0xFAA732, 50, 3) EndIf If Not @error Then ; wenn oranger Alarm ausgelöst wurde, dann ConsoleWrite("Oranger Alarm" & @CRLF) ; schreibe es in die Console _ProblemKnopf("orange") ; führe Function aus Else ;ConsoleWrite("Kein Treffer bei orangener Alarm" & @CRLF) EndIf ; Wenn in den unten stehenden Koordinaten die Farbe rot (0xA00000) zu finden ist, ist Warnstufe 2 angesagt If $sLocation = "GP" Then $aCoord = PixelSearch(-2833, 835, -2771, 872, 0xA00000, 50, 3) Else $aCoord = PixelSearch(-1225, 820, -1146, 866, 0xA00000, 50, 3) EndIf If Not @error Then ConsoleWrite("Roter Alarm" & @CRLF) _ProblemKnopf("rot") ; führe Function aus Else ;ConsoleWrite("Kein Treffer bei rotem Alarm" & @CRLF) EndIf ConsoleWrite("Funktion _PixelbereichScannen Ende" & @CRLF) EndFunc ;==>_PixelbereichScannen Func _ProblemKnopf($sFarbe) ConsoleWrite("Funktion _ProblemKnopf Anfang" & @CRLF) ConsoleWrite("$iAlarmCounter ist: " & $iAlarmCounter & @CRLF) If Not $iAlarmCounter = 2 Then ; Wenn der Counter 0 oder 1 ist, dann gehe in die IF Schleife, wenn der Counter 2 ist (es wurde bereits OK gedrückt), dann bleib draußen. Local $sLabel ConsoleWrite("$iAlarmCounter ist: " & $iAlarmCounter & @CRLF) If $iAlarmCounter = 0 Then ; wenn der Counter 0 ist, erstelle die GUI nur einmal $iAlarmCounter = 1 ; setze Counter auf 1 ;$hGUI = GUICreate("A L A R M", @DesktopWidth - 100, @DesktopHeight - 100, -1, -1, 0x01000200) EndIf ; hier ist der Counter auf 1, d.h. die Oberfläche wird angepasst. ConsoleWrite("$sFarbe ist: " & $sFarbe & @CRLF) If $sFarbe = "orange" Then ; wenn orangener Alarm, dann GUISetBkColor(0xFAA732, $hGUI) ; färbe den Hintergrund in Orange ein Else ; ansonsten roter Alarm GUISetBkColor(0xA00000, $hGUI) ; ansonsten in rote Farbe EndIf If $sFarbe = "orange" Then ; wenn orangener Alarm, dann GUICtrlSetData($sLabel, "ORANGENER ALARM") ; schreibe diesen Text als Label Else ; ansonsten GUICtrlSetData($sLabel, "ROTER ALARM") ; schreibe diesen Text als Label EndIf GUISetState(@SW_SHOW, $hGUI) ConsoleWrite("Rückgabe von @error nachdem GUI aktualisiert wurde: " & @error & @CRLF) EndIf If $sFarbe = "orange" Then ; wenn orangener Alarm, dann _PlaySound("orange") Else ; ansonsten roter Alarm _PlaySound("rot") EndIf ConsoleWrite("Funktion _ProblemKnopf Ende" & @CRLF) EndFunc ;==>_ProblemKnopf Func _PlaySound($sFarbe) ConsoleWrite("Funktion _PlaySound Anfang" & @CRLF) ConsoleWrite("$sFarbe ist: " & $sFarbe & @CRLF) Local $aSound, $sound, $tText If $sFarbe = "orange" Then ; wenn orangener Alarm, dann $aSound = _SoundOpen(@ScriptDir & "\orange.wav") Else ; ansonsten roter Alarm $aSound = _SoundOpen(@ScriptDir & "\rot.wav") EndIf If @error = 2 Then MsgBox($MB_SYSTEMMODAL, "Fehler", "Die Datei existiert nicht.") Exit ElseIf @extended <> 0 Then Local $iExtended = @extended ; Zuweisung, weil @extended nach DllStructCreate() geändert wird Local $stText = DllStructCreate("char[128]") DllCall("winmm.dll", "short", "mciGetErrorStringA", "str", $iExtended, "struct*", $tText, "int", 128) MsgBox($MB_SYSTEMMODAL, "Fehler", "Öffnen fehlgeschlagen." & @CRLF & "Fehlernummer: " & $iExtended & @CRLF & "Fehlerbeschreibung: " & DllStructGetData($stText, 1) & @CRLF & "Beachte: Möglicherweise kann der Sound dennoch korrekt abgespielt werden.") Else ;~ MsgBox($MB_SYSTEMMODAL, "Erfolgsmeldung", "Die Datei wurde erfolgreich geöffnet.") EndIf ConsoleWrite("$iAlarmCounter ist: " & $iAlarmCounter & @CRLF) If $iAlarmCounter = 1 Then ; Wenn der Counter auf 1 ist, sprich ein Alarm wurde ausgelöst, dann soll der Sound erklingen ConsoleWrite("Sound sollte spielen" & @CRLF) ;~ _SoundPlay($aSound, 0) Else ; wenn der Counter auf 0 oder 2 steht, sprich man hat OK gedrückt, dann soll der Sound ausgehen. ConsoleWrite("$Sound sollte aus sein" & @CRLF) _SoundClose($sound) EndIf ConsoleWrite("Funktion _PlaySound Ende" & @CRLF) EndFunc ;==>_PlaySound Func _OKpressed() ConsoleWrite("Funktion _OKpressed Anfang" & @CRLF) GUIDelete($hGUI) ; und lösche die GUI $iAlarmCounter = 2 ; setze Counter auf 2 ConsoleWrite("$iAlarmCounter ist: " & $iAlarmCounter & @CRLF) ConsoleWrite("Funktion _OKpressed Ende" & @CRLF) EndFunc ;==>_OKpressed Func _Exit() Exit EndFunc ;==>_Exit #EndRegion ; FunktionenIch dachte mit GUISetState(@SW_SHOW, $hGUI) erzeugt man einen Refresh der GUI?
Vermutlich ist es das gleiche, wie ich hier schon mal hatte. Die GUI soll aber halt dann aktualisiert werden, wenn ich einen orangenen oder roten Alarm habe. Das muss doch irgendwie möglich sein.
-
Hallo alpines, vielen Dank für die Info. Für den schnellen Test mache ich jetzt mal den "schlampigen Workaround", werde das aber dann zeitnah umbauen.
Ich habe noch 2 weitere Fragen.
1.) Ich prüfe ja mit $aCoord = PixelSearch(-2833, 835, -2771, 872, 0xXXXXXX) auf die Existenz eines Farbcodes 0xXXXXXX (wobei hier 0xXXXXXX als Variable für meine anderen Farben zu sehen ist). Im konkreten Fall prüfe ich auf die Farben grün, orange und rot. Wie muss ich denn eine 4. Prüfung schreiben, die mir z.B. eine MsgBox hochpoppt, wenn an diesen Koordinaten eine andere Farbe als diese 3 zu sehen ist. Ich will damit sicherstellen, das ich mein Monitorfenster wieder nach vorne hole, falls ich es mal temporär mit einem anderen Fenster überdeckt habe.
2.) Ich habe ursprünglich mal den Wert 0xFAA731 eingegeben. Jetzt bin ich in einer anderen Lokation, wo der LCD Monitor hier den Wert 0xFAA732 erkennt. Kann man das irgendwie einstellen, das ein paar Farbnuancen noch oben und unten als Toleranz gewertet werden?
-
Guten Morgen, jetzt muss ich den Thread doch nochmals öffnen
Code
Python
Alles anzeigen#Region ;**** Directives created by AutoIt3Wrapper_GUI **** #AutoIt3Wrapper_Change2CUI=y #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI **** #Region ; mögliche Includes einbinden, bzw. nur die notwendigen einbinden. #include <MsgBoxConstants.au3> #include <TrayConstants.au3> #include <Sound.au3> #include <Array.au3> #include <GUIConstantsEx.au3> #include <WindowsConstants.au3> #EndRegion ; mögliche Includes einbinden, bzw. nur die notwendigen einbinden. #Region ; Script Kopf #cs ---------------------------------------------------------------------------- AutoIt Version: 3.3.14.5 Author: Code4Fun Script Function: Das Script scannt einen bestimmten Bereich auf dem Monitor. Dieser Bereich zeigt ein webbasiertes Servermonitoring. Im Normalfall ist dort die Farbe grün = OK Wenn es auf orange oder rot wechselt, soll dieses Script hier später einen aktustischen Alarm auslösen. Erstellungendatum: vom 25.04.2019 Änderungsdatum: Version: 0.0.1.0 History: 0.0.1: Initialerstellung #ce ---------------------------------------------------------------------------- #EndRegion ; Script Kopf #Region ; AutoIt-Spezifischen Optionen Opt("GUICloseOnESC", 1) ; Wenn man die ESC Taste drückt, wird die GUI geschlossen, da eine $GUI_EVENT_CLOSE Nachricht gesendet wird Opt("MustDeclareVars", 1) ; Variablen (Dim / Global / Local / Const) müssen deklariert sein. Wichtig für Fehlersuche Opt("TrayIconDebug", 1) ; Zeigt die aktuelle Skriptzeile im Trayicon Tipp um das Debugging zu unterstützen Global $exititem, $sFarbe, $hGUI, $sButton Global $iAlarmCounter = 0 #EndRegion ; AutoIt-Spezifischen Optionen AdlibRegister(_PixelbereichScannen, 1000) ;Tray-Menü anpassen Opt("TrayAutoPause", 0) ; Script will not be paused when clicking the tray icon. Opt("TrayOnEventMode", 1) Opt("TrayMenuMode", 1 + 2) $exititem = TrayCreateItem("Beenden") TrayItemSetState(-1, $TRAY_UNCHECKED) TrayItemSetOnEvent(-1, "_Exit") TraySetState() #Region ; Hauptschleife While 1 Switch GUIGetMsg() Case $GUI_EVENT_CLOSE ExitLoop Case $sButton ; wenn OK Button gedrückt wird .. _OKpressed() EndSwitch WEnd #EndRegion ; Hauptschleife #Region ; Funktionen Func _PixelbereichScannen() Local $aCoord ; Wenn in den unten stehenden Koordinaten die Farbe grün (0x53A000) zu finden ist, ist alles OK $aCoord = PixelSearch(-2833, 835, -2771, 872, 0x53A000) If Not @error Then ; wenn alles OK ist dann ConsoleWrite("OK" & @CRLF) ; schreibe OK $iAlarmCounter = 0 ; setze Counter wieder zurück auf 0 Else ;ConsoleWrite("Kein Treffer bei OK" & @CRLF) EndIf ; Wenn in den unten stehenden Koordinaten die Farbe orange (0xFAA732) zu finden ist, ist Warnstufe 1 angesagt $aCoord = PixelSearch(-2833, 835, -2771, 872, 0xFAA732) If Not @error Then ; wenn oranger Alarm ausgelöst wurde, dann ConsoleWrite("Oranger Alarm" & @CRLF) ; schreibe es in die Console _ProblemKnopf("orange") ; führe Function aus Else ;ConsoleWrite("Kein Treffer bei orangener Alarm" & @CRLF) EndIf ; Wenn in den unten stehenden Koordinaten die Farbe rot (0xA00000) zu finden ist, ist Warnstufe 2 angesagt $aCoord = PixelSearch(-2833, 835, -2771, 872, 0xA00000) If Not @error Then ConsoleWrite("Roter Alarm" & @CRLF) _ProblemKnopf("rot") ; führe Function aus Else ;ConsoleWrite("Kein Treffer bei rotem Alarm" & @CRLF) EndIf EndFunc ;==>_PixelbereichScannen Func _ProblemKnopf($sFarbe) If Not $iAlarmCounter = 2 Then ; Wenn der Counter 0 oder 1 ist, dann gehe in die IF Schleife, wenn der Counter 2 ist (es wurde bereits OK gedrückt), dann bleib draußen. Local $sLabel If $iAlarmCounter = 0 Then ; wenn der Counter 0 ist, erstelle die GUI nur einmal $iAlarmCounter = 1 ; setze Counter auf 1 $hGUI = GUICreate("A L A R M", @DesktopWidth - 100, @DesktopHeight - 100, -1, -1, 0x01000200) EndIf ; hier ist der Counter auf 1, d.h. die Oberfläche wird angepasst. If $sFarbe = "organe" Then ; wenn orangener Alarm, dann GUISetBkColor(0xFAA732, $hGUI) ; färbe den Hintergrund in Orange ein Else ; ansonsten roter Alarm GUISetBkColor(0xA00000, $hGUI) ; ansonsten in rote Farbe EndIf If $sFarbe = "organe" Then ; wenn orangener Alarm, dann $sLabel = GUICtrlCreateLabel("ORANGENER ALARM", 600, 100, 600, 200) ; schreibe diesen Text als Label GUICtrlSetFont($sLabel, 50, 900) Else ; ansonsten $sLabel = GUICtrlCreateLabel("ROTER ALARM", 600, 100, 600, 200) ; diesen Text als Label GUICtrlSetFont($sLabel, 50, 900) EndIf $sButton = GUICtrlCreateButton("OK", 700, 400, 100, 50) ; erstelle OK Button. GUICtrlSetFont($sButton, 50, 900) GUISetState(@SW_SHOW) EndIf If $sFarbe = "organe" Then ; wenn orangener Alarm, dann _PlaySound("organe") Else ; ansonsten roter Alarm _PlaySound("rot") EndIf EndFunc ;==>_ProblemKnopf Func _PlaySound($sFarbe) ; Öffne Sound-Datei ; dies muß verändert werden, falls das Skript unter Vista läuft Local $aSound, $sound, $tText If $sFarbe = "organe" Then ; wenn orangener Alarm, dann $aSound = _SoundOpen(@ScriptDir & "\orange.wav") Else ; ansonsten roter Alarm $aSound = _SoundOpen(@ScriptDir & "\rot.wav") EndIf If @error = 2 Then MsgBox($MB_SYSTEMMODAL, "Fehler", "Die Datei existiert nicht.") Exit ElseIf @extended <> 0 Then Local $iExtended = @extended ; Zuweisung, weil @extended nach DllStructCreate() geändert wird Local $stText = DllStructCreate("char[128]") DllCall("winmm.dll", "short", "mciGetErrorStringA", "str", $iExtended, "struct*", $tText, "int", 128) MsgBox($MB_SYSTEMMODAL, "Fehler", "Öffnen fehlgeschlagen." & @CRLF & "Fehlernummer: " & $iExtended & @CRLF & "Fehlerbeschreibung: " & DllStructGetData($stText, 1) & @CRLF & "Beachte: Möglicherweise kann der Sound dennoch korrekt abgespielt werden.") Else ;~ MsgBox($MB_SYSTEMMODAL, "Erfolgsmeldung", "Die Datei wurde erfolgreich geöffnet.") EndIf If $iAlarmCounter = 1 Then ; Wenn der Counter auf 1 ist, sprich ein Alarm wurde ausgelöst, dann soll der Sound erklingen ConsoleWrite("$iAlarmCounter ist (Sound sollte spielen): " & $iAlarmCounter & @CRLF) ;~ _SoundPlay($aSound, 0) Else ; wenn der Counter wieder auf 0 steht, sprich man hat OK gedrückt, dann soll der Sound ausgehen. ConsoleWrite("$iAlarmCounter ist (Sound sollte aus sein): " & $iAlarmCounter & @CRLF) _SoundClose($sound) EndIf EndFunc ;==>_PlaySound Func _OKpressed() GUIDelete($hGUI) ; und lösche die GUI $iAlarmCounter = 2 ; setze Counter auf 2 ConsoleWrite("kommt aus _OKpressed: " & $iAlarmCounter & @CRLF) EndFunc ;==>_OKpressed Func _Exit() Exit EndFunc ;==>_Exit #EndRegion ; FunktionenIch habe das Problem, das meine Funktion _OKpressed() (Zeile 67) erst aufgerufen werden soll, nachdem die GUI gebaut wird. Jedoch ist es aktuell so, das beim Starten des Scriptes dieses gleich nonstop durch die Funktion _OKpressed() läuft.
Vermutlich hat es was damit zu tun, dass $sButton zu diesem Zeitpunkt noch nicht existiert. Wie kann ich dass dann umgehen?
-
-
water: Danke jetzt geht es wunderbar. Jetzt muss ich nur noch den MP3 Teil "erfinden" und einbauen. Falls Ihr zufällig hier im Forum einen Thread kennt, der auch schon mit MP3 Ausgabe in autoit gespielt hat, wäre ich für eine Link sehr dankbar.
-
Hallo hier mal mein Script
Spoiler anzeigen
Python
Alles anzeigen#Region ;**** Directives created by AutoIt3Wrapper_GUI **** #AutoIt3Wrapper_Change2CUI=y #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI **** #Region ; mögliche Includes einbinden, bzw. nur die notwendigen einbinden. #include <GUIConstantsEx.au3> ; für GUI Create, events #include <MsgBoxConstants.au3> ; für MsgBox #include <TrayConstants.au3> #EndRegion ; mögliche Includes einbinden, bzw. nur die notwendigen einbinden. #Region ; Script Kopf #cs ---------------------------------------------------------------------------- AutoIt Version: 3.3.14.5 Author: Code4Fun Script Function: Das Script scannt einen bestimmten Bereich auf dem Monitor. Dieser Bereich zeigt ein webbasiertes Servermonitoring. Im Normalfall ist dort die Farbe grün = OK Wenn es auf orange oder rot wechselt, soll dieses Script hier später einen aktustischen Alarm auslösen. Erstellungendatum: vom 25.04.2019 Änderungsdatum: Version: 0.0.1 History: 0.0.1: Initialerstellung #ce ---------------------------------------------------------------------------- #EndRegion ; Script Kopf #Region ; AutoIt-Spezifischen Optionen Opt("GUICloseOnESC", 1) ; Wenn man die ESC Taste drückt, wird die GUI geschlossen, da eine $GUI_EVENT_CLOSE Nachricht gesendet wird Opt("MustDeclareVars", 1) ; Variablen (Dim / Global / Local / Const) müssen deklariert sein. Wichtig für Fehlersuche Opt("TrayIconDebug", 1) ; Zeigt die aktuelle Skriptzeile im Trayicon Tipp um das Debugging zu unterstützen Global $exititem #EndRegion ; AutoIt-Spezifischen Optionen AdlibRegister(_PixelbereichScannen, 1000) ;Tray-Menü anpassen Opt("TrayAutoPause", 0) ; Script will not be paused when clicking the tray icon. Opt("TrayOnEventMode", 1) Opt("TrayMenuMode", 1 + 2) $exititem = TrayCreateItem("Beenden") TrayItemSetState(-1, $TRAY_UNCHECKED) TrayItemSetOnEvent(-1, "_Exit") TraySetState() #Region ; Hauptschleife While 1 WEnd #EndRegion ; Hauptschleife #Region ; Funktionen Func _PixelbereichScannen() Local $aCoord ; Wenn in den unten stehenden Koordinaten die Farbe grün (0x53A000) zu finden ist, ist alles OK If $aCoord = PixelSearch(-2833, 835, -2771, 872, 0x53A000) Then If Not @error Then ConsoleWrite("OK" & @CRLF) Else ConsoleWrite("Kein Treffer bei OK" & @CRLF) EndIf EndIf ; Wenn in den unten stehenden Koordinaten die Farbe orange (0xFAA732) zu finden ist, ist Warnstufe 1 angesagt If $aCoord = PixelSearch(-2833, 835, -2771, 872, 0xFAA732) Then If Not @error Then ConsoleWrite("Oranger Alarm" & @CRLF) Else ConsoleWrite("Kein Treffer bei orangener Alarm" & @CRLF) EndIf EndIf ; Wenn in den unten stehenden Koordinaten die Farbe rot (0xA00000) zu finden ist, ist Warnstufe 2 angesagt If $aCoord = PixelSearch(-2833, 835, -2771, 872, 0xA00000) Then If Not @error Then ConsoleWrite("Roter Alarm" & @CRLF) Else ConsoleWrite("Kein Treffer bei rotem Alarm" & @CRLF) EndIf EndIf EndFunc ;==>_PixelbereichScannen Func _Exit() Exit EndFunc ;==>_Exit #EndRegion ; FunktionenBeschreibung vom Script:
Das Script scannt einen bestimmten Bereich auf dem Monitor. Dieser Bereich zeigt ein webbasiertes Servermonitoring.
Im Normalfall ist dort die Farbe grün = OK
Wenn es auf orange oder rot wechselt, soll dieses Script hier später einen aktustischen Alarm auslösen (aktuell nur ein Konsolenausgabe)
Aktuell habe ich ein System mal vom Netz genommen, d.h. an der zu suchenden Stelle ist jetzt die Farbe rot. Es wird mir aber in der Console nur Kein Treffer bei OK und Kein Treffer bei orangener Alarm ausgegeben. Es müsste doch aber auch Roter Alarm ausgegeben werden. Alle 3 Farben wurden mit einer Farbpipette ausgelesen.
Es ist das erste mal, das ich mit sowas rumspiele, es fehlt also der Erfahrungswert. BTW. Kann mir vielleicht noch jemand helfen, wie ich später statt der Consolenausgabe eine MP3 Sounddatei abspiele.
Vielen Dank
-
Danke für eure Hilfe. Ich habe es jetzt "ähnlich" der Lösung von BugFix selbst so gemacht. Da ich ja in der Aufgabenplanung bereits eine EXE als "Monitoring" laufen habe, habe ich dort einfach geschaut, ob meine "Haupt.exe" noch läuft. Da diese sich ja sauber beendet, aber noch die eine "conhost.exe" offen ist, wird hieraus die PID dieser speziellen "conhost.exe" ermittelt und dann beendet. Funktioniert bisher sehr gut. Ich werde diesen Thread von daher mal als erledigt markieren.
-
Die Anwendungen werden alle mit dem Run Befehl gestartet.
-
Function _01_AppStarter()
Code
Alles anzeigenFunc _01_AppStarter() ; das ist die Hauptfunktion, die beim Start der Anwendung die anderen Funktionen steuert GUICtrlSetData($sLabel3, "") GUISetState(@SW_SHOW, $hGUI) $hTimer = TimerInit() ; Beginnt den Timer speichert das Handle in einer ; .... hier kommen die ganzen Funktionen rein WinActivate("[TITLE:AppStarter]") _01_SetConsoleTitle("Anwendungen werden gestartet") ;WinMove("[TITLE:Bitte hier eine Beschreibung eintragen; CLASS:ConsoleWindowClass]", "", 413, 1, 993, 520) WinMove("[TITLE:Anwendungen werden gestartet; CLASS:ConsoleWindowClass]", "", 413, 1, 993, 520) ConsoleWrite("IP wird gecheckt" & @CRLF) _02_AppIPChecker() WinActivate("[TITLE:AppStarter]") ConsoleWrite("diverse Kleinanwendungen werden gestartet" & @CRLF) _99_AppsStarten() Sleep(5000) WinActivate("[TITLE:AppStarter]") ConsoleWrite("Tawk.to wird gestartet" & @CRLF) _99_TAWKTO() WinActivate("[TITLE:AppStarter]") ConsoleWrite("Notepad++ wird gestartet" & @CRLF) _99_Notepadpp() WinActivate("[TITLE:AppStarter]") ConsoleWrite("KeePass wird gestartet" & @CRLF) _99_KeePass() WinActivate("[TITLE:AppStarter]") ConsoleWrite("Skype wird gestartet" & @CRLF) _99_Skype() WinActivate("[TITLE:AppStarter]") ConsoleWrite("Microsoft Edge wird gestartet" & @CRLF) _99_MSEdge() WinActivate("[TITLE:AppStarter]") ConsoleWrite("Google Chrome wird gestartet" & @CRLF) _99_GoogleChrome("https://atbtalk.usp365.de/de/Home/Dashboard") WinActivate("[TITLE:AppStarter]") ConsoleWrite("Telegram wird gestartet" & @CRLF) _99_Telegram() WinActivate("[TITLE:AppStarter]") ConsoleWrite("Microsoft Teams wird gestartet" & @CRLF) _99_MSTeams() WinActivate("[TITLE:AppStarter]") ConsoleWrite("Microsoft OneNote wird gestartet" & @CRLF) _99_MSOneNote() WinActivate("[TITLE:AppStarter]") ConsoleWrite("Lotus Notes wird gestartet" & @CRLF) _99_LotusNotes() WinActivate("[TITLE:AppStarter]") ConsoleWrite("Microsoft Outlook wird gestartet" & @CRLF) _99_MSOutlook() WinMove("[TITLE:Anwendungen werden gestartet; CLASS:ConsoleWindowClass]", "", 3803, 55, 993, 520) WinActivate("[TITLE:AppStarter]") ConsoleWrite("Firefox wird gestartet" & @CRLF) _99_Firefox("") ;~ WinActivate("[TITLE:AppStarter]") ;~ ConsoleWrite("Citrix wird gestartet" & @CRLF) ;~ _99_Citrix() ConsoleWrite("Fertig" & @CRLF) $fDiff = Round(TimerDiff($hTimer) / 1000, 3) GUICtrlSetData($sLabel3, $fDiff) ConsoleWrite("benoetigte Zeit: " & $fDiff & @CRLF) ;WinActivate("[TITLE:AppStarter]") ;GUISetState(@SW_SHOW, $hGUI) ;MsgBox(64, "Fertig", "Alles wurde gestartet", 5) EndFunc ;==>_01_AppStarterund hier die Ausgabe des Kommandozeilen Fenster
Ausgabe vom Kommandozeilen Fenster
Code
Alles anzeigenIP wird gecheckt diverse Kleinanwendungen werden gestartet Tawk.to wird gestartet Checking for update > $hWnd = 0x00000000000A1590 <-- Vergleiche das Handle mit dem was dir vom AutoIt-Info-Tool angezeigt wird, wenn WinMove nicht funktioniert! - $iMove = 0x00000000000A1590 Notepad++ wird gestartet > $hWnd = 0x0000000000171272 <-- Vergleiche das Handle mit dem was dir vom AutoIt-Info-Tool angezeigt wird, wenn WinMove nicht funktioniert! - $iMove = 0x0000000000171272 KeePass wird gestartet Update for version 2.0.1 is not available (latest version: 2.0.1, downgrade is disallowed. Skype wird gestartet > $hWnd = 0x0000000000100BF2 <-- Vergleiche das Handle mit dem was dir vom AutoIt-Info-Tool angezeigt wird, wenn WinMove nicht funktioniert! - $iMove = 0x0000000000100BF2 Microsoft Edge wird gestartet > $hWnd = 0x000000000010100E <-- Vergleiche das Handle mit dem was dir vom AutoIt-Info-Tool angezeigt wird, wenn WinMove nicht funktioniert! - $iMove = 0x000000000010100E Google Chrome wird gestartet Seiten wiederherstellen? ist vorhanden Telegram wird gestartet > $hWnd = 0x000000000010096A <-- Vergleiche das Handle mit dem was dir vom AutoIt-Info-Tool angezeigt wird, wenn WinMove nicht funktioniert! - $iMove = 0x000000000010096A Microsoft Teams wird gestartet > $hWnd = 0x00000000000B069C <-- Vergleiche das Handle mit dem was dir vom AutoIt-Info-Tool angezeigt wird, wenn WinMove nicht funktioniert! Teams gefunden - $iMove = 0x0000000000200534 Microsoft OneNote wird gestartet > $hWnd = 0x00000000000A1410 <-- Vergleiche das Handle mit dem was dir vom AutoIt-Info-Tool angezeigt wird, wenn WinMove nicht funktioniert! - $iMove = 0x00000000000A1410 Lotus Notes wird gestartet > $hWnd = 0x00000000000908D6 <-- Vergleiche das Handle mit dem was dir vom AutoIt-Info-Tool angezeigt wird, wenn WinMove nicht funktioniert! - $iMove = 0x00000000000908D6 Microsoft Outlook wird gestartet > $hWnd = 0x00000000000B0084 <-- Vergleiche das Handle mit dem was dir vom AutoIt-Info-Tool angezeigt wird, wenn WinMove nicht funktioniert! - $iMove = 0x00000000000B0084 Firefox wird gestartet > $hWnd = 0x00000000001213E2 <-- Vergleiche das Handle mit dem was dir vom AutoIt-Info-Tool angezeigt wird, wenn WinMove nicht funktioniert! - $iMove = 0x00000000001213E2 Fertig benoetigte Zeit: 77.006 Alle Anwendungen wurden gestartet. In 5 Sekunden beendet sich diese Anwendung Zeile nachdem 5 Sekunden gewartet wurde. Jetzt kommt als nõchstes der Exit Aufruf -
Das verstehe ich jetzt nicht. Wenn ich in der _01_AppStarter() irgendwo festhängen würde (was ich ich nicht mache, da ich ja das Ende der Funktion kenne und das auch ausgeführt wird), dann dürfte doch die Zeile ConsoleWrite("Alle Anwendungen wurden gestartet. In 5 Sekunden beendet sich diese Anwendung" & @CRLF) gar nicht aufgerufen werden. Oder? Da die aber aufgerufen wird, muss ja auch der
erfolgen.
Es wird ja auch die GUIDelete($hGUI) ; schließe die GUI abgearbeitet. Und ein Exit sollten doch hart durchgreifen.
-
Hallo alpines, habe jetzt etwas optimieren können, aber noch hängt es an einer Stelle.
Hier mal der wichtige Code:
Code
Alles anzeigen#Region ; Hauptschleife $iMsg = 0 While 1 $iMsg = GUIGetMsg() Switch $iMsg Case $iBTNStart ; wenn der Button "Apps starten gedrückt wird, wird die Funktion _01_AppStarter()aufgerufen. _01_AppStarter() ConsoleWrite("Alle Anwendungen wurden gestartet. In 5 Sekunden beendet sich diese Anwendung" & @CRLF) Sleep(5000) Exit Case $iBTNKill ; wenn der Button "Apps beenden" gedrückt wird, wird die Funktiion _KILL() aufgerufen. _KILL() ConsoleWrite("Alle Anwendungen wurden beendet. In 5 Sekunden beendet sich diese Anwendung" & @CRLF) Sleep(5000) Exit Case $GUI_EVENT_CLOSE ; Die Anwendung wird geschlossen ExitLoop EndSwitch WEnd GUIDelete($hGUI) ; schließe die GUI #EndRegion ; HauptschleifeBeim Case $iBTNKill funktioniert alles einwandfrei. Ich bekomme zum Schluß in der Kommandozeile die Meldung Alle Anwendungen wurden beendet. In 5 Sekunden beendet sich diese Anwendung angezeigt. Dann bleibt es über den Sleep(5000) noch offen und wird sauber mit Exit beendet.
Beim Case $iBTNStart sieht das leider anderst aus. Auch hier bekomme ich in der Kommandozeile die Meldung Alle Anwendungen wurden gestartet. In 5 Sekunden beendet sich diese Anwendung. Nach den 5 Sekunden schließt sich jedoch das Kommandozeilen Fenster nicht, sondern bleibt mit der Meldung stehen. Der Cursor blinkt eine Zeile darunter noch. Der Befehl GUIDelete($hGUI) wird aber ausgeführt, d.h. meine GUI wird beendet. Es bleibt wie gesagt nur das Kommandozeilen Fenster offen.
Was mache ich hier noch falsch?
-
Hallo,
ich würde - zu Monitorzwecken - mein Script als CUI EXE compilieren (was auch geht). Jedoch habe ich folgende 2 Fragen.
1.) Wenn sich das CUI Fenster öffnet, steht als Fenster Title Bitte hier eine Beschreibung eintragen. Wo genau definiere ich denn diesen Title?
2.) Wenn ich das nur als GUI compiliere, dann schließt sich nach Ablauf des Scripts (es werden nur andere Anwendungen damit gestartet) die GUI. Bei der CUI Variante bleibt das CUI Fenster aber geöffnet. Kann man das irgendwie auch automatisch schließen lassen?
Vielen Dank
-
Danke für eure Hilfe. Der Tip mit den Countern war gut. Funktioniert jetzt super.
ABER !!! Die 1. EXE läuft als Dienst noch nicht. Habe Sie folgendermaßen als Dienst unter Windows 10 - Version 1809 (Build 17763.379) eingerichtet.
CMD als Administrator geöffnet und dann folgenden Befehl ausgeführt.
Codesc create "AppStarter Monitor Service" start= auto binpath= "C:\Pfad zur Anwendung\AppStarterMonitorService.exe"Muss man sein Script irgendwie noch vorbereiten, damit es als Dienst läuft?
Fehlermeldung ist: Der Dienst "AppStarter Monitor Service" auf "Lokaler Computer" konnte nicht gestartet werden. Fehler 1053: Der Dienst antwortete nicht rechtzeitig auf die Start- oder Steuerungsanforderung
Nachtrag: Ich habe es jetzt "temporär" via Windows Aufgabenplanung gelöst, d.h. sobald ich mich anmelde, wird die 1. EXE gestartet. Dienst wäre etwas schicker.
-
Guten Morgen,
ich möchte gerne folgendes verwirklichen.
Ein Script (EXE) bauen, die als Windows dienst läuft. Diese frägt mit AdlibRegister eine Funktion ab, welche nach der Existenz eines bestimmten Fenstern sucht. Sobald dieses Fenster existiert, soll eine weiteres Script (EXE) gestartet werden, welches genau einmal durchläuft und sich dann selbst beendet.
Aktuell wird die aufgerufene EXE aber alle 250 ms neu gestartet, da ich bisher den Aufruf nur mit Run verwirklicht habe. Wie bilde ich hier den ein RunOnce ab?
Kurze Erklärung was hier genau passieren soll.
- Die 1. EXE läuft als Dienst uns schlummert im Hintergrund.
- Wenn ich dann ein Telefonat reinbekomme, öffnet sich das Fenster, auf welches der Dienst wartet.
- Wenn das Fenster entdeckt wird, soll die 2. EXE nur einmal starten. Diese positioniert 2 Fenster genau 1 mal an bestimmte Koordinaten. Danach beendet sich die 2. EXE
- Problem ist jetzt, das die 1. EXE ja das zu suchende Fenster gleich wieder findet, jetzt aber die 2. EXE nicht mehr ausgeführt werden soll.
Danke für Eure Hilfe
-
Danke Bitnugger für die Erklärung.
Jetzt habe ich aber noch ein anderes kleines Problem. Ich muss aber zugeben, das ich bisher mit While ... Wend noch nicht bewußt gearbeitet habe.
In meinem Script habe ich eine Funktion, welche kurz vor Feierabend (natürlich manuell ausgelöst) viele meiner manuell gestarteten Anwendungen beendet.
Ich habe jetzt 2 Anwendungen, die beide CSBridge.exe heißen, jedoch aus 2 unterschiedlichen Verzeichnissen gestartet wurden.Zuerst hatte ich nur die Zeile ProcessClose("CSBridge.exe"), welche aber nur eine Instanz beendet hat.
Danach habe ich den Aufruf 2x gestartet, was aber auch nicht immer geholfen hat.
Jetzt möchte ich das gerne mit einer Schleife lösen, aber irgendwas mache ich noch falsch, da die Schleife gar nicht abgearbeitet wird.
Ich denke mein Aufruf While $iPID NOT 0 stimmt noch nicht ganz.
Was mache ich hier falsch?
CodeFunc _KILL() Local $iPID ConsoleWrite("die $iPID ist aktuell: " & $iPID & @CRLF) While $iPID NOT 0 $iPID = ProcessExists("CSBridge.exe") ConsoleWrite("die $iPID ist aktuell: " & $iPID & @CRLF) ProcessClose("CSBridge.exe") ConsoleWrite("die $iPID ist aktuell: " & $iPID & @CRLF) WEnd EndFuncVielen Dank
-
Cool, die 2. Variante mit dem ";" hat funktioniert. Kannst Du mir, bzw. den Mitlesern mal erklären, was hier genau passiert
$hWnd = WinWaitActive("[TITLE:IBM Notes Arbeitsbereich; CLASS:SWT_Window0]", "", 1) ; Wartet maximal 1 Sekunde
Wird hier entweder auf das erscheinen des Titles UND / ODER auf die Klasse gewartet?
-
Hallo Bitnugger,
dein Script fliegt hier raus If Not IsHWnd($hWnd) Then _ErrExit(4, 'Fehler bei WinWaitActive!') ; Fehlermeldung wird erzeugt, somit kann ich die beiden Handles noch nicht vergleichen. Oder macht es Sinn die Consolenausgabe zwischen Until und If Zeile zu setzen.
Wegen den gleichen Koordinaten. Da habe ich ja geschrieben Else ; ansonsten sind dies die Koordinaten der Anwendung (Achtung: müssen vor Ort noch geprüft werden). Ich scripte gerade an meinem Arbeitsplatz zu Hause und muss dann am anderen Arbeitsplatz erst mal die anderen Koordinaten ermitteln.
Zu Deiner Aussage
ZitatFür dein Vorhaben ist die Verwendung von Send eh absolut an keiner Stelle sinnvoll...
muss ich folgends sagen. Ich gebe Dir da im prinzip recht, aber Du kennst ja sicherlich die Windows Tastenkombinationen "WinTaste" + Pfeiltasten, womit man die Fenster wunderbar auf den Monitoren positionieren kann, wenn man Sie im Verhältnis 1:4 1:2 oder 1:1 haben möchte. Dafür war der Gedankengang mit dem Send Befehl.
Nachtrag um 15:11 Uhr.
Ich habe jetzt eine weitere Anwendung, die sich nicht verschieben lässt. Habe jetzt den Handle via Console ausgeben lassen, als das Script noch gelaufen ist. Der Wert war 0x00000000001F0E96. Nachdem das Script beendet war habe ich die Anwendung mit dem Windows Info Tool gegen gecheckt. Hier ist der Handle 0x00000000001C1196. Ist das normal, dass sich der Handle ändert?
-
Noch eine kleine Frage nebenbei. Wie bilde ich Autoit den die Tastenkombination "gedrückte linke Windows Taste + z.B. Pfeiltaste 1x nach oben drücken" ab.
Das hier
geht irgendwie nicht. Es öffnet sich hier das Windows Menü. Ich dachte ich hole mir vorher nochmals von Lotus Notes den Focus, aber irgendwie will das nicht
CodeIf $sLocation = "GP" Then ; wenn Du im Homeoffice bist, sind dies die Koordinaten der Anwendung Sleep(20000) ConsoleWrite("Warten fertig" & @CRLF) WinActivate($hApp) ; nochmals sicher stellen, dass das Fenster von Lotus Notes den Focus hat Send("{LWIN down}{UP}") ; halt die linke Windows Taste gedrückt und klicke 1 mal die Pfeiltaste nach oben ;~ Send("{LWIN down}{RIGHT}") ; halt die linke Windows Taste gedrückt und klicke 1 mal die Pfeiltaste nach oben Send("{LWIN up}") ; lass die linke Windows Taste wieder los. ;~ WinMove($hApp, "", $iX, $iY, $iW, $iH) ; Verschiebt die Anwendung an obige Koordinaten Else ; ansonsten sind dies die Koordinaten der Anwendung -
Also die Lösung von Bitnugger scheint oft zu gehen, aber leider nicht immer. Auch habe ich den WinTitleMatchMode auf 4 gestellt.
Hier ein Problem mit Lotus Notes
Code von Lotus Notes
Code
Alles anzeigenFunc _99_LotusNotes() ; Lotus Notes Local $iWait = 0, $iX, $iY, $iW, $iH, $sAppName $sAppName = "Lotus Notes" GUICtrlSetData($sLabel5, $sAppName) GUISetState(@SW_SHOW, $hGUI) If $sLocation = "GP" Then ; wenn Du im Homeoffice bist, sind dies die Koordinaten der Anwendung $iX = 3015 $iY = 34 $iW = 592 $iH = 996 Else ; ansonsten sind dies die Koordinaten der Anwendung (Achtung: müssen vor Ort noch geprüft werden) $iX = 3015 $iY = 34 $iW = 592 $iH = 996 EndIf Local $iPID = Run("C:\Program Files (x86)\IBM\Notes\notes.exe", "", @SW_MINIMIZE) ; starte Lotus Notes If Not $iPID Then _ErrExit(4, 'Fehler bei Run!') ; Fehlermeldung wird erzeugt Do Local $hApp = WinWaitActive("[TITLE:IBM Notes]", "", 1) ; Wartet maximal 1 Sekunde $iWait += 1 Until $hApp Or $iWait = 20 If Not IsHWnd($hApp) Then _ErrExit(4, 'Fehler bei WinWaitActive!') ; Fehlermeldung wird erzeugt Sleep(250) ; Vorsichtshalber noch etwas warten! (Teste auch mal ohne, oder evtl. erhöhen, wenn WinMove nicht klappt.) ;ab hier könnte unter Umständen noch eine weitere Interaktion mit der jeweiligen Anwendung passieren, z.B. Benutzerdaten eintrage usw. If $sLocation = "GP" Then ; wenn Du im Homeoffice bist, sind dies die Koordinaten der Anwendung WinActivate($hApp) ; nochmals sicher stellen, dass das Fenster von Lotus Notes den Focus hat Sleep(10000) ConsoleWrite("10 Sekunden warten sind rum" & @CRLF) WinMove($hApp, "", $iX, $iY, $iW, $iH) ; Verschiebt die Anwendung an obige Koordinaten Else ; ansonsten sind dies die Koordinaten der Anwendung WinActivate($hApp) ; nochmals sicher stellen, dass das Fenster von Lotus Notes den Focus hat WinMove($hApp, "", $iX, $iY, $iW, $iH) ; Verschiebt die Anwendung an obige Koordinaten EndIf EndFunc ;==>_99_LotusNotesDas Script geht in Zeile 26 definitiv in den IF Bereich rein (sehe ich ja anhand der Consolen Ausgabe), aber der WinMove geht nicht. Lotus Notes bleibt immer in der Größe, wie es zuvor geschlossen wurde.
Hier mal die Ausgabe vom aktuellen Windows Info
Aktuelle Werte von Windows Info
Code
Alles anzeigen>>> Window <<<< Title: IBM Notes Arbeitsbereich Class: SWT_Window0 Position: 2336, 91 Size: 799, 839 Style: 0x96CF0000 ExStyle: 0x00100100 Handle: 0x00000000000F0DF2 >>>> Control <<<< Class: Instance: ClassnameNN: Name: Advanced (Class): ID: Text: Position: Size: ControlClick Coords: Style: ExStyle: Handle: >>>> Mouse <<<< Position: 2653, 103 Cursor ID: 0 Color: 0xFFFFFF >>>> StatusBar <<<< >>>> ToolsBar <<<< >>>> Visible Text <<<< Gesamte Mail suchen Arbeitsbereich >>>> Hidden Text <<<< scratchpad scratchpad NotesIch habe auch mal gehört, das manche Anwendungen sich die letzte Position merken. Wie ist das denn abgelegt, bzw. wie kann man das manipulieren?
Danke für eure Hilfe
Nachtrag um 15:54 Uhr: mit Outlook ist es genau das gleiche. Da moved rein gar nichts.