Standby unterdrücken

  • VB.NET

Es gibt 19 Antworten in diesem Thema. Der letzte Beitrag () ist von zulu23.

    soviel ich weis gibt es jedemenge variationen mit denen man den StandBy Modus einleiten kann,
    1. Powertaste ( Regestry)
    2. ShutDown.Exe
    3. PowerManagement (cpl)
    4. WMI
    und vermutlich noch einige mehr.
    Die Frage die ich mir stelle, arbeiten all diese Funktionen denn mit dem selben Code.
    Ich glaube eher nein. Somit müsstest du alle Variationen ausfindig machen und abschalten.

    zu1. Regestrie Eintrag abschalten
    - Akku Betrieb und Netz Betrieb. Reg eintrag tillen. geht
    zu2. ShutDown.Exe
    - über Timer abfangen und eliminieren, geht
    - oder ShutDown.Exe einfach löschen, geht
    zu3. CPL abfangen, wie bei 2
    zu4. keine Ahnung .....

    vieleicht gibt es noch mehr möglichekeiten. z.B. API
    aber dann müsste Alex2000 mal in seinem Katalog nachschauen.
    Sorry ich glaube ich hab mich etwas schlecht ausgedrückt, aber suche nicht den Code um den PC in standby zu bringen sondern wie ich den PC daran hindern kann, das er in den Standby geht....

    Ich habe ein Programm das den PC nach dem ausführen in den Standby schickt, aber ich will solange mein Programm auch noch akiv ist das dieser Befehl unterdrückt wird, d.h. das er in Standby gehen kann wenn mein Programm auch fertig ist....
    Wir müssen da zwei Fälle unterscheiden:
    Windows kann den Standby selbstständig initiieren, wenn es meint, er sei unbeschäftigt.
    Und du kannst auf irgendeine der vormals erwähnten Standby-Tasten drücken.
    Ersteres lässt sich mit SetThreadExecutionState verhindern, für letzteres ist mir spontan keine Lösung bekannt.
    Ersteres lässt sich mit SetThreadExecutionState verhindern, für letzteres ist mir spontan keine Lösung bekannt.
    Wenn ich richtig verstanden habe kannst du nicht mit Funktion SetThreadExecutionState den Standby Modus verhindern.
    MSDN:
    The 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.
    Du kannst System Energieoptionen auslesen, und dann kannst den Standby modus bei bestimmten erreignisse in deine Anwendung deaktivieren, bzw wieder aktivieren.
    Das geht alles mit Hilfe von WIN API funktionen !
    Bilder
    • Energieoptionen.JPG

      58,6 kB, 618×546, 290 mal angesehen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Alex2000“ ()

    Hab' ich behauptet, dass es jede Art von Standby-Aktivierung unterbinden würde? Nein:

    Renati schrieb:

    Wir müssen da zwei Fälle unterscheiden:
    Windows kann den Standby selbstständig initiieren, wenn es meint, er sei unbeschäftigt. [1]
    Und du kannst auf irgendeine der vormals erwähnten Standby-Tasten drücken. [2]
    Ersteres lässt sich mit SetThreadExecutionState verhindern, für letzteres ist mir spontan keine Lösung bekannt.

    Und das tut es sehr wohl, denn:

    MSDN schrieb:

    ES_SYSTEM_REQUIRED
    0x00000001
    Forces the system to be in the working state by resetting the system idle timer.

    Dann muss man auch nicht in den Ernegieoptionen des Benutzers rumpfuschen.
    @zulu23: ich würde sagen du probierst einfach und poste deine ergebnisse. So wie in MSDN steht "Diese Funktion kann nicht standby verhindern", renati mit einem anderen lösung gekommen.

    EDIT//
    Kommt darauf, was du möchtest. Den idle-induzierten Standby deaktivierst du so, aber wie Alex2000 geschrieben hat, ist das Deaktivieren des manuellen Standbys nicht erwünscht.
    Nicht manuell, sondern per Code, hate bild angehängt damit man versteht was ich meine !
    Also ich bin entlich dazu gekommen das lästige "automatisch in den Standby gehen" zu testen :)

    Ich hab mir die Variante SetThreadExecutionState angeschaut da ich denke es sollte die sein die mein Problem lösen sollte.
    Nochmals zur Problemstellung, ich setzte meine Compi öffters in den Ruhezustand oder Standby...wenn ich ihn dann wecke und dann vom PC weg gehe bevor ich etwas am PC gemacht habe geht er automatisch nach ca. 5min wieder in den Ruhezustand oder Standby und genau das möchte ich verhindern.

    Also habs jetzt mal so gemacht:

    VB.NET-Quellcode

    1. Private Declare Function SetThreadExecutionState Lib "kernel32" (ByVal esFlags As Long) As Long
    2. Public Enum EXECUTION_STATE As Integer
    3. ES_CONTINUOUS = &H80000000
    4. ES_DISPLAY_REQUIRED = &H2
    5. ES_SYSTEM_REQUIRED = &H1
    6. ES_AWAYMODE_REQUIRED = &H40
    7. End Enum
    8. Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick
    9. 'Power Save off, Standby/Ruhemodus bei inaktivität wird unterbunden
    10. SetThreadExecutionState(EXECUTION_STATE.ES_SYSTEM_REQUIRED)
    11. Timer2.Stop()
    12. End Sub


    Nun ich hoffe ich hab das so richtig gemacht? ?(
    Wie verhält sich das ganze beim nächsten aufwachen? muss ich das jedesmal machen oder genügt es dies einmalig zu machen?
    Mit welchem EXECUTION_STATE kann ich das rückg$ngig machen bzw. muss oder kannich das überhaupt?

    Danke und Gruss

    zulu23
    hmmmm irgendwie klappt das nicht wirklich :( der Compi fährt trotzdem wieder automatisch in den Standby/Ruhezustand

    Gemäss MSDN:

    HTML-Quellcode

    1. ES_SYSTEM_REQUIRED 0x00000001
    2. Forces the system to be in the working state by resetting the system idle timer.


    sollte doch ES_SYSTEM_REQUIRED den Timer reseten der den Compi wieder in den Standby/Ruhezustand versetzt?

    Kann mir niemand einen Tip geben?

    zulu23
    Ich weiß nicht obs geht, aber ich hätte eine ziemlich simple Methode. Der PC geht nicht in Ruhestand wenn sich die Maus bewegt. Wie wäre es nun wenn schaut das innerhalb von 10 Minuten oder so keine Useraktion passierte und wenn nicht und sich bald der Standby aktivieren würde, bewegst du via Code einfach den Mauszeiger um paar Pixel.
    Nun weiß ich natürlich nicht ob Windows einfach nur die Mauszeigerbewegung anerkennt oder ob dies nur funktioniert wenn über die Perepherie ein Signal kommt.
    Das mit der Mausbewegen hab ich mir auch schon überlegt, aber leider funktioniert das nicht :(
    Windows anerkennt nur eine Mauszeigerbewegung wenn sie von der Perepherie selber kommt...d.h. irgendwie muss ich das anders hinbekommen...
    Der Ansatz mit SetThreadExecutionState sollte doch eigentlich nicht schlecht sein aber die Initialisierung fällt mir etwas schwer und ich bin mir nicht sicher ob ich es richtig gemacht habe oder nicht?

    Trotzdem danke für den Tip...
    @zulu23:lade dir API-View runter, dann hast du richtige API Deklration, das was du hast ist VB 6 Deklaration, so wird nicht funz.
    In google oder hier in forum findest jede menge links zu API View für VB NET.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Alex2000“ ()

    also sollte doch SetThreadExecutionState auch gehen gemäss dem unten stehenden Text!?

    Grundlagen:
    msdn.microsoft.com/en-us/library/ms703398
    You can use the SetThreadExecutionState function to disable the idle-to-sleep and display-blanking time-outs. However, disable these time-out periods only if absolutely necessary, such as when data or media loss will occur, or when there are special "hands-off" scenarios, such as watching a movie. Be sure to restore the time-out periods after your operation is completed.