Eingabe per Tastaturbefehl - Monitor aus?

  • Guten Tag,
    ich bin neu im Forum, ein Grüß Gott an alle.
    Ich realisiere das eine oder andere Projekt - ohne für mich in Anspruch zu nehmen "Programierer zu sein". Nun stehe ich vor einem Problem das ich wahrscheinlich nur nicht verstehe.
    Ich habe ein kleines Autoit Programm geschrieben, das eigentlich zu meiner Zufriedenheit funktioniert und auch wieder nicht.
    Autoit ruft eine Software im DOS Fenster auf (alte Software die im DOS Fenster läuft) danach werden Tastaturcodes an das Programm gesendet, das Programm führt diese aus -- das geht alles.

    Nun läuft dieses Autoit Programm auf einem Rechner - zeitgesteuert, dessen Bildschirm aus ist. Rechner läuft 24 Stunden am Tag, eine Art Service Rechner im Netz (XP SP3). Immer wenn ich den Bildschirm an habe, egal ob körperlich oder per Windows Remote auf den Rechner zugreife, läuft das Autoit Programm. Remote (damit auch Bildschirm) aus dann habe ich den Eindruck nichts geht mehr. Autoit arbeitet nicht mehr. Kontrolieren kann ich es nur in sofern, als das Programm eben nicht abgearbeitet wird, solage kein Monitor an, bzw keine Remote Zugriff auf Rechner. Sofern man dem Ganzen zusieht - läuft prima.

    Mein Verdacht: Bildschirmeingaben nur wenn auch Bildschirm an?
    hier ein Code Schnipsel, das sind die "Eingaben"

    if WinExists ( $pfad_programm, "" ) Then ; prüfen ob geladen, durch fensterabfrage, dann fenster in den vordergrund holen.
    _WinWaitActivate($pfad_programm,"")
    $FensterTitle = WinGetTitle("") ; hier einlesen Fenstertitel um den für den späteren abgleich zu haben
    EndIf
    ;Sleep (100)
    ;Send("{DOWN}{DOWN}{DOWN}{DOWN}{ENTER}")
    Sleep (200)
    Send("{ENTER}") ; für bestätigen sachbearbeiter
    Sleep (500)
    Send("asdfg123") ; bei eingabe maximaler datenlänge entfällt das ernter pasw = maximal
    Sleep (4000) ; hier längere Pause, Prog läd einstellungen
    if WinExists ( $pfad_programm, "" ) Then ; prüfen ob Wawi geladen, durch fensterabfrage, dann fenster in den vordergrund holen.
    _WinWaitActivate($pfad_programm,"")
    EndIf
    Send ("g") ; wechseln zur Eingabeseite für Neuberechnung
    Sleep (500)
    Send ("g")
    Sleep (500)


    Wenn diese Beschreibung "ungehobelt klingt" --> Nachsicht. Source kann natürlich gepostet werden.


    Danke

    Peter

    Hinweise auf Suchmaschinen finde ich überflüssig - wer fragt hat es nicht gefunden oder nicht verstanden. Die Antwort gibt sich oftmals schneller als der Hinweis auf Dr. Goggle & Co.

    Ab 19-10-22 ergänzt um:

    Die Welt wird nicht bedroht von den Menschen, die böse sind, sondern von denen, die das Böse zulassen. (Albert Einstein)

    Einmal editiert, zuletzt von Peter S. Taler (4. Mai 2015 um 12:33)

  • Soweit ich weiß dürfte es keinen Einfluss haben, ob der Bildschirm an/aus ist. Wenn ich meinen Bildschirmausmache kann ich immernoch die maus bewegen und sachen anklicken...
    Mögliche Lösung: Könnte es sein, dass der Rechner in Standby geht, wenn ne Zeitlang nichts gemacht wird?
    Andere Vermutung:

    AutoIt
    if WinExists ( $pfad_programm, "" ) Then ; prüfen ob geladen, durch fensterabfrage, dann fenster in den vordergrund holen.
    _WinWaitActivate($pfad_programm,"")
    $FensterTitle = WinGetTitle("")

    Wieso willst du den Titel eines "" Fensters->leeren Fensters???, war nicht "[active]" für das aktive? und dann würde ich auch den Handle nehmen, titel,... kann sich ändern.
    WinExists mit $pfad_programm macht für mich auch nicht wirklich sinn, außer dein Fenster hat den Pfad deines Programmes als Titel... fänd ich irgendwie komisch.

    Ansonsten, bau mal ConsoleWrites in deinen Code ein. Damit kannst du dir dann anzeigen lassen, bis wo das Programm läuft, und ab wo es nicht weitergeht.

  • Es ist tatsächlich so, dass das Fenster den Namen des Programm Pfades trägt. Die Geschichte mit dem leeren Fenstertitel - ich gebe es zu, ist mir auch unklar was ich mir dabei gedacht habe - macht keinen Sinn - schadet aber auch nichts - wie gesagt, solange ein Monitor angeschalten ist - funktionierts auch. NEIN der PC geht nie in den Ruhezustand. Gibt es ev. einen Unterschied zwischen Monitor elektrisch an und elektrisch an, softwaremäßig Ruhezustand. Hier ist der Monitor elektrisch aus.

    Gruß
    Peter


    PS: Ich nehme die sinnlose Abfrage natürlich aus dem Code.

    Hinweise auf Suchmaschinen finde ich überflüssig - wer fragt hat es nicht gefunden oder nicht verstanden. Die Antwort gibt sich oftmals schneller als der Hinweis auf Dr. Goggle & Co.

    Ab 19-10-22 ergänzt um:

    Die Welt wird nicht bedroht von den Menschen, die böse sind, sondern von denen, die das Böse zulassen. (Albert Einstein)

  • Der Monitor hat normalerweise NICHTS mit der Software zutun, außer sie fragt irgendwas vom Monitor ab. Ich mache meinen Bildschirm oft aus, während der Rechner noch irgendwas bearbeitet.
    Es wäre gut, wenn du den Completten code und wenn möglich das programm selbst auch mit hochlädst. Es müsste was spezifisches sein, was dein Programm betrifft und eher kein genereller Fehler.

  • Wieso willst du den Titel eines "" Fensters->leeren Fensters???, war nicht "[active]" für das aktive?

    Ein leerer String matched jedes Fenster im Standardmodus - und wenn mehrere Fenster gematched werden zählt jenes, welches zuletzt verwendet wurde. Demnach das aktive. Demnach matchen sowohl ein leerer String als auch "[active]" das aktive Fenster. ;)

    Mein Tipp warum es nicht funktioniert:

    Solange AutoIT nicht als Dienst läuft, ist eine Windows-Anmeldung zwingend notwendig. Ebenso darf der PC nicht gesperrt [Win+L] sein. Für gewöhnlich ist es bei "Service-PCs" [Ich spare mir mal den Vortrag darüber, dass man Geräte ohne 24h-Hardware nicht 24/7 laufen lassen sollte...] wie bei Servern allerdings so, dass zumeist kein Nutzer angemeldet ist, oder zumindest der Computer gesperrt wird, um unauthorisierte oder versehendliche Eingaben zu verhindern. Und das wird vermutlich auch hier das Problem sein: RDP-Verbindung -> Meldet sich zuerst am Gerät an. Wenn man selbst gucken will -> meldet man sich an, weil sonst sieht man ja nichts.

    Sollte dies das Problem sein, empfehle ich diesen Thread aus diesem Forum:

    Kompal. Script als Dienst starten

    Liebe Grüße
    EineXage

    Es gibt Tage, da trete ich nicht ins Fettnäpfchen. Ich falle in die Friteuse.

  • Danke das mit den 24 Stunden ist bekannt. Hardware = 7/24h. Xp natürlich nicht -> xp wird alle 24h einmal automatisch neugestartet, und meldet sich auch automatisch wieder an. Das funktioniert seit Jahren. Dieser Rechner ist ein extra Benutzer der auch angemeldet ist. Der Rechner führt auch andere Arbeiten - auch Autoit scribte - selbstständig aus funktioniert alles (seit z.T. Jahren) reibungslos.
    Habe den Source als Anlage hochgeladen. Ich gebe zu- das ist vielleicht nicht alles optimal programiert, aber was ich so über die Jahre zusammengebastelt habe läuft. Dieses Scribt auch - solange ein Monitor an ist.

    Gruß

    Peter

    PS: Das mit dem Dienst werde ich selbstverständlich ausprobieren.... und berichten. Wenn es funktionieren würde - würde ich es nicht verstehen - anyway :)

    Dateien

    Hinweise auf Suchmaschinen finde ich überflüssig - wer fragt hat es nicht gefunden oder nicht verstanden. Die Antwort gibt sich oftmals schneller als der Hinweis auf Dr. Goggle & Co.

    Ab 19-10-22 ergänzt um:

    Die Welt wird nicht bedroht von den Menschen, die böse sind, sondern von denen, die das Böse zulassen. (Albert Einstein)

  • Also ob der Monitor aus ist, oder kein Monitor angeschlossen ist, ist egal.
    Ich habe div. geräte, die keinen Monitor angeschlossen haben oder der Monitor aus ist und die Scripts laufen absolut Problemlos.

    Installiert doch mal vnc oder Teamviewer. Dann kannst du schauen, was der PC macht, auch wenn der Monitor aus oder nicht angeschlossen ist.

    Gruss Roger

  • Der Rechner führt auch andere Arbeiten - auch Autoit scribte - selbstständig aus funktioniert alles (seit z.T. Jahren) reibungslos.

    Soll heißen, zur gleichen Zeit wo das betreffende Script nicht arbeitet, läuft definitiv ein anderes einwandfrei ?

    Dann fällt natürlich auch jeder Idee weg, der Rechner wäre z.B. in einen Energiesparmodus gegangen und wach erst wieder auf, wenn jemand Maus oder Tastatur verwendet. Aber das könnte man dann ja auch streichen...

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:

    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"

  • @Micha_he . Ja genau so ist es. Das Scribt wird 8.00 Sonntag Morgen gestartet. Mir ist seit Wochen nicht aufgefallen, dass das Scribt nie fertig wird, der Rechner wird um 12,10 Uhr automatisch heruntergefahren, bis dorthin war das Scribt gar nicht wirklich gelaufen, das hängt sozusagen an der ersten Fenstereingabe. Kaum schaut man aber zu (monitor an/REMOTE DESKTOP an), gibt das Scribt "Gas" und läuft reibunslos. Monitor aus (Windows Remte Konsole aus) - das aufgerufene Programm macht seine Berechnungen fertig, das Scribt läuft bis zur nächsten Fenstereingabe. Hänger.
    Wie gesagt, um 12,10 runter/rauf --> Scribt ex ich merke es nicht. Bis dahin laufen zwei andere Scribts reibungslos. Auch ein kleiner Mail Server , ein e-mail Scanner usw - läuft sauber.

    Fürs Wochenende werde ich die Scribtdurchläufe mal verkleinern, damit das compacter wird, und dem ganzen nochmal hinterhergehen. D.H. ich werde mich mal mit control Send beschäftigen - wie oben geraten.
    Sofern jemand noch eine Idee hat - bitte um "Zuspruch"

    Danke
    Peter

    Hinweise auf Suchmaschinen finde ich überflüssig - wer fragt hat es nicht gefunden oder nicht verstanden. Die Antwort gibt sich oftmals schneller als der Hinweis auf Dr. Goggle & Co.

    Ab 19-10-22 ergänzt um:

    Die Welt wird nicht bedroht von den Menschen, die böse sind, sondern von denen, die das Böse zulassen. (Albert Einstein)

    Einmal editiert, zuletzt von Peter S. Taler (5. Mai 2015 um 09:13)

  • hallo,
    du hast in deinem Script öfters ein _WinWaitActivate($pfad_programm,""), daher wartet dein Skript, bis dein Programm aktiv ist.
    Baue hier dochmal anstatt diesem, das WinActivate ( "title" [, "text"] ) ein. Eventuell ist da sonst ein anderes aktiv.

    [autoit]


    If WinExists ($pfad_programm, "" ) Then ; prüfen ob Wawi geladen, durch fensterabfrage, dann fenster in den vordergrund holen.
    ;_WinWaitActivate($pfad_programm,"")
    WinActivate ( "dein Programm")
    ;$FensterTitle = WinGetTitle("") ; hier einlesen Fenstertitel um den für den späteren abgleich zu haben. Wird, da eigentlich siinnlos auskommentiert
    EndIf

    [/autoit]

    Gruß gmmg

  • Hallo Peter,
    um das Problem "Online" zu verfolgen, würde ich eine TCP-Verbindung von dem "nicht" laufenden Skript zu einem anderen Computer aufbauen und die Daten (Tastatureingaben etc...) die du an das DOS-Fenster sendest, nochmals über TCP senden. Dann weißt du schonmal, ob das Skript hängt oder ob es an sonst was liegt.

    Gruß
    Homer J. S.

    ...wenn die Donuts auch nur halb so gut schmecken wie sie aussehen, dann sehen sie doppelt so gut aus wie sie schmecken...

    8 Mal editiert, zuletzt von Homer J. S. (9. Mai 2015 um 08:02)

  • Er braucht doch nur eine lokale Logdatei mitschreiben, in die er nach jeder Zeile bzw. nach jedem Schleifendurchlauf einen Kommentar anhängt. Später kann er sehen, bis zu welcher Zeile bzw. welchem Schleifendurchlauf das Script lief.

    Einfacher als noch eine TCP-Verbindung ins Leben zu rufen...

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:

    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"

  • @Micha_he: Bei einer TCP Verbindung kann man aber "life" schauen, was wann wie passiert. Und so was zu implementieren ist nicht wirklich mehr Aufwand, wie bei einem Logfile.


    Edit:
    Ich würde als erstes über TCP mit AdlibRegister ein Lifebit setzen, um zu sehen ob das Skript überhaupt noch läuft.


    Gruß
    Homer J. S.

    ...wenn die Donuts auch nur halb so gut schmecken wie sie aussehen, dann sehen sie doppelt so gut aus wie sie schmecken...

    Einmal editiert, zuletzt von Homer J. S. (9. Mai 2015 um 10:44)

    • Offizieller Beitrag

    Hallo,

    ich habe dein Script mal etwas umgebaut, es wird jetzt geprüft ob evtl. schon eine oder sogar mehrere Instanzen vom Programm laufen. Sollten schon welche laufen werden diese beendet. Zusätzlich wird vom neu gestarteten Programm die PID und der Handle vom Windows gespeichert, dass erleichtert den Zugriff. Ein Logging hab ich auch eingebaut, dass kannst du abschalten wenn du die Variable $bLogging auf False setzt.

    Mir ist aufgefallen das beim IniRead für die Variable zaehler in der Anweisung ein "h" fehlt, ich wusste jetzt nur nicht ob es ein Schreibfehler im Script ist oder ob der Wert so in der INI-Datei steht.

    Damit das Programm richtig funktioniert muss immer ein Benutzer angemeldet sein und der Bildschirm darf nicht gesperrt sein. Der Grund dafür ist die Interaktion mit Programm über den Desktop. Also schauen das der Bildschirmschoner deaktiviert ist und das Powermanagement auf "volle Leistung" gestellt ist.

    Ich kann das Script leider nicht im vollen Umfang testen, ich hoffe ich habe nicht vergessen. Für Schäden übernehme ich keine Haftung!

  • Mahlzeit,
    Vorab ein herzliches Dankeschön an alle Helfer. Problem gelößt (ich hoffe ich muß nicht zurückrudern).

    Fangen wir damit an was es nicht war:
    Es war kein Problem mit Rechten, Konten oder Benutzern, Kein Problem das man durch ein Run as Service lößen hätte können - im Gegenteil hier stieg der Rechner wunderbar aus.

    Alle die gesagt hatten, es muß funktionieren und die "Eingabe von Tastencodes" würde auch ohne Monitor funktionieren hatten recht!

    Controll send anstelle von send waren nicht die Lösung habe ich aber eingebaut, ist wie empfohlen die Bessere Lösung.
    _winwaitactivate habe ich auch rausgeworfen.
    Die bei bernd 670 abgeschaute Lösung mit
    WinSetOnTop($pfad_programm, "", 1)
    WinSetTitle($pfad_programm, "", $fenstername )
    und das setzen eines einmaligen Namens (hinter $fenstername steht ein Zähler) für das Fenster hat dem Scribt gut getan.

    All das hat mir geholfen das Scribt zu verbessern. Und hat zu guter letzt zur Fehlerfindung beigetragen.

    Es war ein simples Timing Problem. Obwohl ich der DOS box die höchst Hintergrundaktivität zugewiesen hattbe - die geht - lief das Scribt im Hintergrund einen ticken zu langsam, sodass es beim 2ten login hängen blieb, das Scribt lief schneller als das Programm folgen konnte. Insbesonders der Aufbau des Fensters beim Starten dauert im Hintergrund länger. Bitte nicht nachfragen warum das so ist ich habe keine Ahnung, das ist auch keine riesen Zeitspanne aber eben genug um das ganze au dem Tritt zu bringen. Den Timmer vonn 4000 auf 11.000 und schon liefs rund.

    Ein par Minuten hin oder her sind für das Scribt kein Problem


    Danke an alle - Problem gelößt


    Peter

    Hinweise auf Suchmaschinen finde ich überflüssig - wer fragt hat es nicht gefunden oder nicht verstanden. Die Antwort gibt sich oftmals schneller als der Hinweis auf Dr. Goggle & Co.

    Ab 19-10-22 ergänzt um:

    Die Welt wird nicht bedroht von den Menschen, die böse sind, sondern von denen, die das Böse zulassen. (Albert Einstein)