Hallo allerseits,
ist es möglich, in einem PureBasic-Programm herauszufinden, ob gerade ein Standby oder Ruhezustand stattgefunden hat?
Der Hintergrund ist folgender:
Ich schreibe ein Programm, das mir die tägliche Nutzung des PCs dokumentiert.
Und hierbei möchte ich wissen, wann am PC gearbeitet wird und wann er unbenutzt im Leerlauf läuft, ohne abgeschaltet worden zu sein.
Das Programm soll selbständig nebenher laufen und die Arbeit am PC in keiner Weise beeinträchtigen.
Ausschalten des Rechners nur über das Programm oder eine spezielle Eingabe vor dem Standby oder Ruhezustand ist deshalb für mich keine Lösung.
Mein erster Lösungsansatz funktioniert leider nicht.
Ich wollte jede Minute den Zeitpunkt in eine Datei speichern und dabei den alten abgespeicherten Zeitpunkt vergleichen, ob er älter als eine Minute ist.
Das klappt natürlich nicht, weil der Standby/Ruhezustand jederzeit und daher auch dann passieren kann, wenn als nächstes Programm-Ereignis wieder das Abspeichern des Zeitpunktes fällig wäre. Das passiert dann beim Wiedereinschalten des Rechners. Und so kann man dann am abgespeicherten Zeitpunkt nicht erkennen, dass vorher eine Pause war.
In der API-Library hab ich auch nichts gefunden.
Jetzt hoffe ich auf irgendeine Systemfunktion oder irgendeine Log-Datei von Windows, in der beim Standby oder Ruhezustand eine Info hinterlegt wird, und die ich von PB aus abfragen kann.
Ich hoffe, Ihr könnt mir helfen.
Gruß
OlderCoder
Abfrage, ob Standby oder Ruhezustand war, geht das??
-
- Beiträge: 134
- Registriert: 18.03.2013 12:30
- Wohnort: Bayerland
- Kontaktdaten:
- ts-soft
- Beiträge: 22292
- Registriert: 08.09.2004 00:57
- Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel - Wohnort: Berlin
Re: Abfrage, ob Standby oder Ruhezustand war, geht das??
Die Abfrage wird mit Sicherheit möglich sein, aber nicht per Log oder Datei, weil diese Zustände, wenn die selbst die
Festplatte aus dem Schlaf wecken, wären so ziemlich sinnlos
Irgendwo hab ich hier mal eine ähnliche Frage gelesen und demnach mußt Du Dein Program als Dienst ausführen, damit
es wirklich noch läuft. Aber genauere Angaben kann ich hierzu nicht machen, dieses Thema hat mich noch nie sonderlich
interessiert. Aber vielleicht findest Du ja den von mir erwähnten Beitrag oder andere Wissen mehr zu dem Thema.
Gruß
Thomas
Festplatte aus dem Schlaf wecken, wären so ziemlich sinnlos

Irgendwo hab ich hier mal eine ähnliche Frage gelesen und demnach mußt Du Dein Program als Dienst ausführen, damit
es wirklich noch läuft. Aber genauere Angaben kann ich hierzu nicht machen, dieses Thema hat mich noch nie sonderlich
interessiert. Aber vielleicht findest Du ja den von mir erwähnten Beitrag oder andere Wissen mehr zu dem Thema.
Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

- NicTheQuick
- Ein Admin
- Beiträge: 8809
- Registriert: 29.08.2004 20:20
- Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti - Wohnort: Saarbrücken
Re: Abfrage, ob Standby oder Ruhezustand war, geht das??
Ich hab's nicht ausprobiert, aber wird die Inkrementierung der Millisekunden seit Computerstart während Standby oder Ruhezustand gestoppt? Also das kann man ja mit 'ElapsedMilliseconds()' abfragen. Falls ja, muss man ja nur vergleichen, ob die Differenz von 'Date()' und in 'ElapsedMilliseconds() / 1000' immer gleich bleibt oder sich irgendwann diese Differenz ändert. Ist das der Fall, war der Computer genau diese Differenz der Differenz im Standby bzw. Ruhezustand.
Unter Windows kann ich mir ansonsten noch vorstellen, dass man das irgendwie hooken kann, genau wie ein Herunterfahren. Will ein Nutzer den Computer herunterfahren, kann man das nämlich auch in seinem Programm feststellen und das Herunterfahren zunächst unterbinden, weil man z.B. noch wichtige Sachen abspeichern muss oder ähnliches. Vielleicht ist sowas dann auch mit Standby bzw. Ruhezustand möglich.
Unter Windows kann ich mir ansonsten noch vorstellen, dass man das irgendwie hooken kann, genau wie ein Herunterfahren. Will ein Nutzer den Computer herunterfahren, kann man das nämlich auch in seinem Programm feststellen und das Herunterfahren zunächst unterbinden, weil man z.B. noch wichtige Sachen abspeichern muss oder ähnliches. Vielleicht ist sowas dann auch mit Standby bzw. Ruhezustand möglich.
-
- Beiträge: 134
- Registriert: 18.03.2013 12:30
- Wohnort: Bayerland
- Kontaktdaten:
Re: Abfrage, ob Standby oder Ruhezustand war, geht das??
Das mit den ElapsedMilliseconds() hätte ich auch schon längst probieren können.
Eigentlich dachte ich, so muss es gehen.
Aber erstaunlicherweise macht der Zähler beim Aufwecken des Rechners einen großen Werte-Sprung, anstatt dort, weiterzuzählen, wo er aufgehört hat, das macht also keinen Sinn.
Es müsste aber doch möglich sein, einen eigenen Zähler mit der DATE()-Funktion irgendwie zu synchronieren und immer wieder zu überprüfen, ob PC-Zeit und dieser Zähler noch gleichauf sind.
Das werde ich mal probieren.
Dann hatte ich noch das hier gefunden:
http://msdn.microsoft.com/de-de/library ... -snippet-1
Aber ich weiß nicht, wie ich das in PB anwenden soll, um es zu testen. Die Syntax der anderen Sprachen ist mir nicht geläufig.
Eigentlich dachte ich, so muss es gehen.
Aber erstaunlicherweise macht der Zähler beim Aufwecken des Rechners einen großen Werte-Sprung, anstatt dort, weiterzuzählen, wo er aufgehört hat, das macht also keinen Sinn.
Es müsste aber doch möglich sein, einen eigenen Zähler mit der DATE()-Funktion irgendwie zu synchronieren und immer wieder zu überprüfen, ob PC-Zeit und dieser Zähler noch gleichauf sind.
Das werde ich mal probieren.
Dann hatte ich noch das hier gefunden:
http://msdn.microsoft.com/de-de/library ... -snippet-1
Aber ich weiß nicht, wie ich das in PB anwenden soll, um es zu testen. Die Syntax der anderen Sprachen ist mir nicht geläufig.
Re: Abfrage, ob Standby oder Ruhezustand war, geht das??
Das ist dotNET. Das kannst du so direkt nicht übersetzen. Höchstens über CommatePlus, aber das ist umständlich und nicht empfehlenswert.
Re: Abfrage, ob Standby oder Ruhezustand war, geht das??
vielleicht hilft es, die Zustandsmeldungen mittels
RegisterPowerSettingNotification() zu erhalten und verarbeiten.
einen Code, anhand Du die Funktionsweise nachvollziehen kannst, findest Du hier:
http://www.purebasic.fr/english/viewtop ... 25#p348825
Grüße ... Kiffi
RegisterPowerSettingNotification() zu erhalten und verarbeiten.
einen Code, anhand Du die Funktionsweise nachvollziehen kannst, findest Du hier:
http://www.purebasic.fr/english/viewtop ... 25#p348825
Grüße ... Kiffi
a²+b²=mc²
-
- Beiträge: 134
- Registriert: 18.03.2013 12:30
- Wohnort: Bayerland
- Kontaktdaten:
Re: Abfrage, ob Standby oder Ruhezustand war, geht das??
Puh, ob ich die Funktionsweise tatsächlich je nachvollziehen können werde, bleibt dahingestellt. Aber danke für den Hinweis.
@RSBasic:
Ich hatte schon sowas befürchtet.
Aber gottseidank geht es viel einfacher.
NicTheQuick hatte mir schon einen Hinweis gegeben.
Aber nachdem ElapsedMilliseconds() nach einem Standby/Ruhezustand irgendwie wieder mit der Uhrzeit nachsynchronisiert zu werden scheint, fällt diese Möglichkeit flach.
Aber absolut einfach geht es auf jeden Fall so:
Der Code im Prinzip.
Einen Zähler mit Date() synchron halten.
Ist er nicht mehr synchron, gab es einen Standby oder Ruhezustand. Aus der Differenz ergibt sich etwa der Anfangszeitpunkt, und die aktuelle Zeit bei der Feststellung ist das Ende.
Manchmal steht man auf dem Schlauch und sieht das Einfachste nicht.
Mir fällt kein Umstand ein, der diese Methode scheitern lässt. Außer ein PC-Absturz oder ein Neustart. Aber über Autostart wird das Programm dann sowieso neu gestartet.
Danke für Eure Antworten!
Gruß
OlderCoder
@RSBasic:
Ich hatte schon sowas befürchtet.
Aber gottseidank geht es viel einfacher.
NicTheQuick hatte mir schon einen Hinweis gegeben.
Aber nachdem ElapsedMilliseconds() nach einem Standby/Ruhezustand irgendwie wieder mit der Uhrzeit nachsynchronisiert zu werden scheint, fällt diese Möglichkeit flach.
Aber absolut einfach geht es auf jeden Fall so:
Code: Alles auswählen
zaehler=Date()
datealt=Date()
Repeat
; Zähler synchron zur Systemzeit halten
If Date()>datealt
zaehler+1
datealt=Date()
EndIf
Delay(100)
; Test auf Unterbrechung und Ausgabe Zeit Anfang u. Ende
If zaehler+1<Date()
Debug FormatDate("%dd.%mm.%yyyy %hh:%ii:%ss",zaehler)
Debug FormatDate("%dd.%mm.%yyyy %hh:%ii:%ss",Date())
zaehler=Date() ;
datealt=Date()
EndIf
ForEver
Einen Zähler mit Date() synchron halten.
Ist er nicht mehr synchron, gab es einen Standby oder Ruhezustand. Aus der Differenz ergibt sich etwa der Anfangszeitpunkt, und die aktuelle Zeit bei der Feststellung ist das Ende.
Manchmal steht man auf dem Schlauch und sieht das Einfachste nicht.
Mir fällt kein Umstand ein, der diese Methode scheitern lässt. Außer ein PC-Absturz oder ein Neustart. Aber über Autostart wird das Programm dann sowieso neu gestartet.
Danke für Eure Antworten!
Gruß
OlderCoder