![]() |
Auf Standby/Ruhezustand überprüfen
Hi DP,
ich möchte gerne meinen PC automatisch um 22 Uhr abends mit einem Programm ausschalten. Dazu wollte ich dann erst schauen, ob der Ruhezustand oder Standby läuft, oder nur der Bildschirm automatisch ausgeschaltet wurde, um zu sehen, ob noch jemand daran arbeitet oder ob er unbenutzt ist und somit ausgeschaltet werden kann, da es in dem 2. Stock, wo der PC steht nach längerer Laufzeit um die 40°C sind!! :stupid: |
Re: Auf Standby/Ruhezustand überprüfen
Du kannst mit
![]()
Code:
Ich mag Pseudocode :stupid:
if (zeit später als 22 Uhr) and (GetLastInputInfo mehr als 5 Minuten) then
ausschalten; else FunktionAufrufenIn(später(22Uhr, 5Minuten - GetLastInputInfo)); |
Re: Auf Standby/Ruhezustand überprüfen
Du kannst nicht prüfen, ob gerade der Standby oder Ruhezustand an ist, da dein Programm in dieser Zeit "lahmgelegt" ist ;)
Du kannst aber reagieren, wenn der PC in einen dieser Modi wechselt. Dazu einfach folgende Funktion zum Formular hinzufügen:
Delphi-Quellcode:
Und so dann aufbauen:
type Form1...
public procedure WndProc(var MyMessage: TMessage); override; ...
Delphi-Quellcode:
Falls die Konstanten fehlen:
procedure TForm1.WndProc(var MyMessage: TMessage);
begin if MyMessage.Msg = WM_POWERBROADCAST then begin // windows powermanagement message if (MyMessage.WParam = PBT_APMQUERYSUSPEND) or (MyMessage.WParam = PBT_APMQUERYSTANDBY) then begin // Hier hin, was getan werden muss, bevor Windows in den Standby darf, // z.B. Netzwerk- oder Datenbankverbindungen trennen, Timer abstellen, etc. MyMessage.Result := 1; // allow standby/hibernation // MyMessage.Result := BROADCAST_QUERY_DENY; // deny standby/hibernation end else if (MyMessage.WParam = PBT_APMRESUMECRITICAL) or (MyMessage.WParam = PBT_APMRESUMESUSPEND) or (MyMessage.WParam = PBT_APMRESUMESTANDBY) then begin // Hier z.B. Verbindungen wiederherstellen end; end; inherited WndProc(MyMessage); end;
Delphi-Quellcode:
PBT_APMQUERYSUSPEND = $0000;
PBT_APMQUERYSTANDBY = $0001; PBT_APMQUERYSUSPENDFAILED = $0002; PBT_APMQUERYSTANDBYFAILED = $0003; PBT_APMSUSPEND = $0004; PBT_APMSTANDBY = $0005; PBT_APMRESUMECRITICAL = $0006; PBT_APMRESUMESUSPEND = $0007; PBT_APMRESUMESTANDBY = $0008; PBTF_APMRESUMEFROMFAILURE = $00000001; PBT_APMBATTERYLOW = $0009; PBT_APMPOWERSTATUSCHANGE = $000A; PBT_APMOEMEVENT = $000B; PBT_APMRESUMEAUTOMATIC = $0012; |
Re: Auf Standby/Ruhezustand überprüfen
Hey,
bei mir kommt ein Fehler beim kompilieren: "WndProc nicht in Basisklasse gefunden" Ich verwende keine normale "Form" sondern ein WindowsDienst also einen "Service" gibts, ne möglichkeit den Ruhezustand trotzdem abzufragen? |
Re: Auf Standby/Ruhezustand überprüfen
Ich hole dieses alte Thema mal wieder hoch da ich gerade an einem ähnlichen Problem arbeite. Folgendes Szenario: In meinem Prog prüft ein Timer alle 5 Minuten eine Netzwerkresource. Im Fehlerfall wird das Programm beendet oder eine Meldung ausgegeben (je nach Fehlerursache).
Auf manchen Rechnern (vorrangig Laptops) kommt es vor, daß die im Standby (nicht Suspend-to-Disk sondern nur Standby) sind. Man möchte meinen, die Programme würden nun ebenfalls schlafen aber dem ist nicht so. Denn weckt man das System aus dem Standby auf, dann habe ich im Fehlerlog eine fehlgeschlagene Netzprüfung zu einem Zeitpunkt als das System im Standby war. Scheinbar laufen die Programme auf Sparflamme weiter, abgeschaltet wird nur der Systembus wo z.B. auch die Netzwerkkarte dran hängt. Das scheint ein Feature zu sein das eingeführt wurde um Rechner softwaregesteuert aus dem Standby zu holen. Scheinbar ist das auf manchen Laptops so gelöst daß einige Aufweckfunktionen über den Treiber gesteuert werden (bisher so entdeckt bei einigen Acer Travelmate und Fujitsu Siemens Lifebook C- und E-Serie) Jetzt ist doch die Frage: Wenn Programme auf eine bestehende Netzverbindung setzen und das System im Standby die Netzwerkkarten abschaltet ohne die betreffenden Anwendungen schlafen zu schicken, dann gibt das Kuddelmuddel. Winamp z.B. scheint da auch über dieses Problem zu stolpern wenn man einen Laptop mit laufendem Shoutcast in den Standby schickt. Wenn Anwendungen weiter laufen im Standby, dann müßte man doch auch abfragen können, ob der Rechner gerade im Standby ist oder nicht und die Peripherie-abhängigen Routinen entsprechend absichern. |
Re: Auf Standby/Ruhezustand überprüfen
im Standby/Ruhezustand schlafen deine Programme definitiv ... im Ruhezustannd ist der PC/Laptop sogar richtig abgeschaltet.
Wenn dein Programm also "wärend der Zeit" noch aktiv war, dann handelt es ich nicht um eines der beiden "Schlafarten". Eventuell gibt es bei deinem Laptop eine Sparfunktion, wo nur der Bildshirm und eventuell noch andere Komponenten abgeschaltet werden und der Rest auf Sparflamme läuft (gibt es ja öfters) Du könntest ja mal alle "globalen" Windowsnachrichten mitloggen und schauen ob Windows eventuell irgendwelche "Warnungen"/Nachrichten rausschickt, wenn/bevor es den PC etwas/teilweise runterfährt. Aber du solltest doch eh eine absicherung drin haben, oder was passiert, wenn mal wer einfach nur das Netzwerkkabel abzieht? |
Re: Auf Standby/Ruhezustand überprüfen
Das passt jetzt nicht direkt hier her, aber Windows selbst hat im Standby-Modus einige Dienste/Prozesse laufen. Ob das bei eigenen Anwendungen so ist, weiß ich nicht, könnte es mir aber vorstellen.
Wenn ich meinen Laptop in den Standby-Modus versetze, dann kehrt er nach genau einer Stunde wieder zurück und fährt in den Ruhezustand (HDD + TFT gehen an und man sieht den Ruhezustandsfortschritt von Windows). Also irgendwas muss da schon aktiv sein. Grüße, Matze |
Re: Auf Standby/Ruhezustand überprüfen
Im Standby-Modus ist der Rechner nicht aus. Es wird nur nicht benötigte Hardware abgeschalten und der Prozessor gedrosselt
|
Re: Auf Standby/Ruhezustand überprüfen
aus geht er da nicht, aber ich denk/dachte, daß da alles abgeschaltet wird, außer eben der RAM und ein paar andere Dinge :gruebel:
nja, wollt grad mal ausprobieren und hab mir ein neues Programm erstellt, was da über 'nen Timer, in einem Label eine Zahl sekündlich erhöht und wollte dann in den Standby ... nja, bis mir einfiehl, daß ich auf meinem Heimrechner das Standby deaktiviert hab und es ja garnicht testen kann ... also PC in Standby, 'nen Minütchen warten und danach mal nachsehn, wie die Zahl im Label nun aussieht, im Vergleich vor'm Standby.
Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
begin Label1.Caption := IntToStr(StrToIntDef(Label1.Caption, 0) + 1); end; |
Re: Auf Standby/Ruhezustand überprüfen
Was ich sagen wollte ist, daß Laptops anscheinend nochmal ein eigenes Süppchen kochen beim Standby. Die obige Testroutine bringt auf verschiedenen Rechnern verschiedene Ergebnisse. Auf allen PCs die ich testen konnte läuft das Label nicht hoch, ebenso auf einigen Laptops. Allerdings, auf dem besagten Travelmate und zwei FSC E-Serien läuft es hoch.
Daher die Frage: Kann man diesen "Fast-ein-richtiges-Standby"-Zustand abfragen während dieser Zustand aktiv ist, da die Anwendung ja definitiv läuft? Auf allen anderen Rechnern würde die Bedingung ja nie erfüllt bzw. die Anwendung ist nicht in der Lage die Abfrage durchzuführen, also kein Problem. Ansonsten, der obige Tip mit den Messages abfangen beim In-den-Standby-fahren funktioniert auch gut. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:59 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz