Bildschirmschoner verhindern

  • Hallo zusammen,

    gibt es eine Möglichkeit, dass der Bildschirmschoner/Standby während das eigene Autoit Script läuft nicht aktiv wird?

    Eigentlich genau das was z.B. jeder Player macht, damit beim Filme schauen kein Bildschirmschoner/Standby aktiviert wird.

    Danke und Gruß

    Mark

    Einmal editiert, zuletzt von GerhardSchr (7. April 2020 um 12:37)

  • gibt es eine Möglichkeit, dass der Bildschirmschoner/Standby während das eigene Autoit Script läuft nicht aktiv wird?

    Dafür gibt es verschiedene Ansätze, hier ist einer davon (getestet mit Win7) :

    AutoIt
    #include <WinAPIProc.au3>
    ; Bildschirmschoner deaktivieren :
    _WinAPI_SetThreadExecutionState(BitOR($ES_AWAYMODE_REQUIRED, $ES_DISPLAY_REQUIRED, $ES_CONTINUOUS, $ES_SYSTEM_REQUIRED))
    MsgBox(0, 'Info', 'Box schließen wenn festgestellt wurde, dass der Bildschirmschoner nicht startet.')
    ; Standard reaktivieren
    _WinAPI_SetThreadExecutionState($ES_CONTINUOUS)

    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."

  • Wir hatten das Thema ja bereits ein paar mal.

    Hat jemand mal getestet ob folgendes auch funktionieren würde:

    Am Skript start als erstes Registryeintrag "Screensaveactive" auf "0" setzen

    Skript läuft

    Am Skript Ende als letztes Registryeintrag "Screensaveactive" auf "1" setzen.

    Ist zwar nicht die schönste aber wohl fast sicherste Methode.

    Das Einzige was mich persönlich dabei stört, es gibt in autoit (meines Wissens) kein "OnDestroy" Event, wie ich es aus Freepascal kenne, so das der Registryeintrag auf jeden Fall (auch bei Absturz etc,) wieder gesetzt wird.

    Wäre dann nur mit Sub-Programm möglich:

    - subprogramm wird gestartet

    - subprogramm liest den Wert des registryeintrags (s.o.) aus -> variable

    - Subprogramm ändert registryeintrag

    - startet das eigentliche skript und wartet auf dessen beendigung (runwait)

    - Subprogramm macht die registryeinstellung rückgängig.

  • Wir hatten das Thema ja bereits ein paar mal.

    Stimmt ;), z.B. Per Script Useraktivität simulieren?

    Am Skript start als erstes Registryeintrag "Screensaveactive" auf "0" setzen [...] Skript läuft

    Am Skript Ende als letztes Registryeintrag "Screensaveactive" auf "1" setzen.
    Ist zwar nicht die schönste aber wohl fast sicherste Methode.

    Hast Du 'meine' Lösung mal unter Win10 ausprobiert ?

    In der Hilfe zu _WinAPI_SetThreadExecutionState steht zwar "This function does not stop the screen saver from executing." (dt.: "Diese Funktion verhindert nicht die Ausführung des Bildschirmschoners. ", aber bei mir funktioniert das problemlos.

    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."

  • Da ich selber es bisher nicht benötige, nein. War auch nur eine Idee die mir kam, falls jemand mal mit den anderen Lösungen Probleme haben sollte.

  • Dafür gibt es verschiedene Ansätze, hier ist einer davon (getestet mit Win7) :

    AutoIt
    #include <WinAPIProc.au3>
    ; Bildschirmschoner deaktivieren :
    _WinAPI_SetThreadExecutionState(BitOR($ES_AWAYMODE_REQUIRED, $ES_DISPLAY_REQUIRED, $ES_CONTINUOUS, $ES_SYSTEM_REQUIRED))
    MsgBox(0, 'Info', 'Box schließen wenn festgestellt wurde, dass der Bildschirmschoner nicht startet.')
    ; Standard reaktivieren
    _WinAPI_SetThreadExecutionState($ES_CONTINUOUS)

    Gruß Musashi

    hiermit hat es super funktioniert.

    Klar, wenn das Script abstürzen sollte, oder "$ES_CONTINUOUS" nicht mehr gesetzt wird bleibt der zustand erhalten...

    Müsste man mal testen, ob ein reboot das wieder auf standard zurücksetzt...(ich schätzte mal schon)


    Danke für eure Hilfe!


    Gruß

    Mark

    Einmal editiert, zuletzt von GerhardSchr (7. April 2020 um 12:55)

  • GerhardSchr: Nochmal zu deiner vorigen Frage:

    Remarks

    The _WinAPI_SetThreadExecutionState() function cannot be used to prevent the user from putting the computer to

    sleep. Applications should respect that the user expects a certain behavior when they close the lid on their

    laptop or press the power button.

    This function does not stop the screen saver from executing.


    Das erste in Fett sollte deine Frage beantworten, letzteres widerspricht irgendwie das dies funktioniert (Bildschirmschoner verhindern), müsste hier das Remark bei der Funktionsbeschreibung geändert werden?

  • hiermit hat es super funktioniert.

    Klar, wenn das Script abstürzen sollte, oder "$ES_CONTINUOUS" nicht mehr gesetzt wird bleibt der Zustand erhalten...
    Müsste man mal testen, ob ein Reboot das wieder auf Standard zurücksetzt...(ich schätzte mal schon)

    Prima ! Du brauchst nicht einmal zu 'rebooten' (getestet unter Win7) !

    Sobald das Skript beendet wird ohne _WinAPI_SetThreadExecutionState($ES_CONTINUOUS) aufzurufen, sei es :

    • durch Absturz
    • durch Abbruch
    • durch Weglassen usw.

    wird der Bildschirmschoner wieder aktiv.

    Es wäre aber kein guter Programmierstil, sich diesen Funktionsaufruf einfach zu schenken :P.

    ... letzteres widerspricht irgendwie das dies funktioniert (Bildschirmschoner verhindern), müsste hier das Remark bei der Funktionsbeschreibung geändert werden?

    Die 'Remarks' in der AutoIt-Hilfe zu _WinAPI_SetThreadExecutionState() wurden 1 zu 1 aus der Quelle kopiert, wie bei _WinAPI_*-Funktionen i.a. üblich docs.microsoft.com..., hier also :

    https://docs.microsoft.com/en-us/windows/…dexecutionstate

    Tweaky : Ob, wie Moombas anregt, die Hilfe angepasst werden sollte, musst Du entscheiden.

    Nebenbei : Ich habe das Flag $ES_AWAYMODE_REQUIRED mal weggelassen -> funktioniert anscheinend auch ohne.

    Hintergrund : In den Microsoft-Docs steht dazu :

    "The ES_AWAYMODE_REQUIRED value should be used only when absolutely necessary ... "

    AutoIt
    #include <WinAPIProc.au3>
    ; Bildschirmschoner deaktivieren :
    _WinAPI_SetThreadExecutionState(BitOR($ES_SYSTEM_REQUIRED, $ES_DISPLAY_REQUIRED, $ES_CONTINUOUS))
    MsgBox(0, 'Info : ', 'Box schließen sobald festgestellt wurde, dass der Bildschirmschoner nicht mehr startet.')
    
    ; Standard reaktivieren
    _WinAPI_SetThreadExecutionState($ES_CONTINUOUS)

    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."

    Einmal editiert, zuletzt von Musashi (7. April 2020 um 19:18)

  • Diese Funktion ist ja noch gar nicht übersetzt, also kann ich nichts ändern ...

    Stimmt - ob deutsch oder englisch nehme ich beim Lesen anscheinend gar nicht mehr wahr ^^.

    Die Übersetzung wäre schnell gemacht. Was mich allerdings irritiert ist die Beschreibung in der englischen AutoIt-Hilfe :

    WinAPI_SetThreadExecutionState

    Prevents the system from entering sleep or turning off the display while the current application is running.

    übersetzt :

    Verhindert, dass das System in den Ruhezustand geht oder den Bildschirm ausschaltet, während die aktuelle Anwendung läuft.

    In den MS-Docs steht :

    Enables an application to inform the system that it is in use, thereby preventing the system from entering sleep or turning off the display while the application is running.übersetzt :

    Ermöglicht es einer Anwendung, das System darüber zu informieren, dass sie in Benutzung ist, und verhindert dadurch, dass das System in den Ruhezustand übergeht oder den Bildschirm ausschaltet, während die Anwendung läuft.

    Trotzdem steht in beiden Docs unter Bemerkungen :

    This function does not stop the screen saver from executing.

    Diese Funktion verhindert nicht die Ausführung des Bildschirmschoners.

    Das ist zumindest missverständlich, wie das o.a. Skript zeigt. Wahrscheinlich ist damit gemeint, dass ein Benutzer trotz dieser Funktion den Computer in den Ruhezustand versetzen kann.

    Falls Du es für sinnvoll hältst, kann ich mal eine Übersetzung machen, inklusive einer erweiterten Bemerkung, die diesen Umstand berücksichtigt.

    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."

  • This function does not stop the screen saver from executing.

    Dies bedeutet doch lediglich, dass der Bildschirmschoner nicht vom System ausgeführt wird, solange der Thread noch läuft... wobei aber nicht verhindert wird, dass er ausgeführt wird, wenn ein beliebiger Prozess ihn startet.

  • Dies bedeutet doch lediglich, dass der Bildschirmschoner nicht vom System ausgeführt wird, solange der Thread noch läuft...

    Ich möchte nur darauf hinweisen, dass man die Beschreibung in der Hilfe missverstehen kann wie der folgende Beitrag ja gezeigt hat ;):

    This function does not stop the screen saver from executing.

    [...] letzteres widerspricht irgendwie dass dies funktioniert (Bildschirmschoner verhindern), müsste hier das Remark bei der Funktionsbeschreibung geändert werden?

    Genau darauf würde ich in der Übersetzung unter 'Bemerkungen' detaillierter eingehen, am besten gleich mit einem Beispiel.

    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."

  • so machen es die Video Player doch auch (vlc)....verhindern, dass der Birdschirmschoner automatisch startet, wenn ein Film läuft.

    Wenn ich aber z.B. Windowstaste + L drücke wird der Schoner gestartet.