![]() |
Akkumanagement (Notifications)
Gab es nicht mal eine Message (Broadcast), wenn sich der Akkustand (Prozent) ändert?
Die Restzeit wird jedenfalls nur bei Änderung neu berechnet (durch Windows). ![]() Mir ist so, als hätte ich ich da früher z.B. ein WM_POWERBROADCAST empfangen. Win7/Win10/Win11, auch ohne sich vorher für eine Notification registrieren zu müssen, oder sowas. Bei Netzteil anstecken/abziehen da kommt was rein, aber nicht bei Änderungen den Akkus. (bei Standby und Co kommen auch viele Messages nicht an, in neueren Windowsen, aber das ist ja dokumentiert) Aktuell habe ich einen Timer, der das aktualisiert, aber mir war, als ginge das mal automatisch, bei Änderung. Anhang: ![]() |
AW: Akkumanagement (Notifications)
Hier sind noch Informationen
![]() Das geht über ![]() Laufzeit steht unter BatteryEstimatedTime Wie man das aber genau programmiert, bin ich noch am testen, komme aber im Moment nicht weiter. |
AW: Akkumanagement (Notifications)
Jupp, das Chaos der letzten Jahre mal bissl aufräumen ... wollte vor 'ner Weile ein/zwei Projekte machen, wo aber nichts so lief wie es sollte.
Drum versuche ich aktuell das Ganze in einer Test/Demo-App zum Laufen zu bringen und mal zusammenzufassen. OK, bei IOCRL war ich jetzt noch garnicht vorbeigekommen. Als Nächstes hatte ich einige Notifications geplant, wo man sich jeweils über GUIDs registriert. (wurde aber durch das Nicht-Aktualisierungsproblemchen aufgehalten) Werde das IOCTL dann wohl aber erstmal angehn. BATTERY_WAIT_STATUS und BATTERY_REPORTING_SCALE sieht aber so aus, wie im CallNrPowerInfo->Batter<State. Aber das sind ja auch wieder "nur" Abfragen. Was ich grade vermisse ist ja eine Notofocation, wo mir Windows sagt "Hey, die Batterie hat sich verändert ... schau dir mal die aktuellen Werte an" (anstatt da ständig mit einem Timer zu pollen) Nervig war, dass ich zuletzt über paar Bugs in der alten WinAPI im Delphi stoperte, sowie dass Vieles einfach fehlt (und dann auch noch Schweigen oder gar Fehler in der Doku von Microsoft, beim Versuch so Einiges selbst nach Delphi zu übersetzen), zuletzt dann die Hoffnung der neuen WinAPI, aber das sieht ja noch katastrophaler aus. ![]() OHH, ein Problem mit großen Server-CPUs. TThread.ProcessorCount sagt 32, aber eigentlich sind es 63 Kerne. Und dann schlägt natürlich der Abruf der "ProcessorInfo" fehl, da der Array-Speicher zu gering reserviert wurde. PS: Youtube im Firefox deaktiert die Monitor- und Standbytimeouts, siehe ExecutionState. (während der Wiedergabe) Was mir auch noch aufgefallen war: * im Taskmanager die %-Werte im Details-Tab stimmen oft garnicht (System ausgelastet, aber dort kein Prozess mit Auslastung zu sehn) * auch stimmen oft die Werte unter Prozesse und Details nicht überein * NtPowerInfo gibt mir die Frequenzen der Kerne (über WMI kommt man auch an sowas) * aber im Taskmanager ... k.A. was der anzeigt ... hier z.B. unter "Leistung" oben rechts beim Namen 2.7 GHz, unten Basistakt 2,9 GHz (OK, WinServer2006 nennt es "Maximale Geschwindigkeit") aber die großgeschriebene "aktuelle" Geschwindigkeit zeigt was an, das nichtmal annähernd dem ausProcessorInfo übereinstimmt (einzelner Kern, Minimal, Maximal, Durchschnitt oder sonstwas) Die Laufzeit hab ich. Bei SystemPowerStatus sieht man auch das, was Windows überall anzeigt. (oben dei LifeTime) OK, es stimmt nicht immer mit der Batterie überein (unten BatteryState), bzw. oben hängt etwas hinterher (aber egal, so lange es oben mit den Windows-Anzeigen korrespondiert) |
AW: Akkumanagement (Notifications)
Für's DeviceIoControl mußt du dir erstmal über die SetupAPI den DeviceNamen für's CreateFile besorgen, um dessen Handle dann dafür nutzen zu können-
![]() ![]() Schade, dass unser foreneigener SetupAPI-Guru schon vor vielen Jahren dahingeschieden ist. |
AW: Akkumanagement (Notifications)
Hallo,
ev. das hier? ![]() oder eher das hier ![]() |
AW: Akkumanagement (Notifications)
Liste der Anhänge anzeigen (Anzahl: 2)
Zumindest das Log für PBT_POWERSETTINGCHANGE hatte ich schon drin.
RegisterPowerSettingNotification aber noch nicht implementiert. Aber, wie gesagt, ich bin mir eigentlich fast sicher, früher in einem anderen Projekt, auch schonmal eine Message bekommen zu haben, wenn sich die Akku-Prozente ändern, auch ohne diese Registrierung. IOCRL: Da Delphi keine "leeren" statischen Arrays kennt, ließ sich der Code anfangs nicht zum Laufen bringen, da SizeOf einen falschen anderen Wert bring, als die API verlangt. Ich weiß grad garnicht, ob ich für codeproject.com ein Login hab, um mir die Demo mal anzusehn. |
AW: Akkumanagement (Notifications)
Du könntest über WMI den Status abfragen und Änderungsevents anfordern.
|
AW: Akkumanagement (Notifications)
Mal wieder mein "Lieblingchatbot" ;-)
Zitat:
Zitat:
Zitat:
Zitat:
Delphi-Quellcode:
procedure GetStatus;
var SystemPowerStatus: TSystemPowerStatus; begin GetSystemPowerStatus(SystemPowerStatus); with SystemPowerStatus do begin // Wird das System mit Wechselstrom oder Akku betrieben ? case ACLineStatus of 0: Label1.Caption := 'System wird mit Akku betrieben'; 1: Label1.Caption := 'System wird mit Wechselstrom betrieben'; else Label1.Caption := 'Unbekannter Status'; end; // Ladezustand der Batterie case BatteryFlag of 1 : Label2.Caption := 'Hoher Ladezustand'; 2 : Label2.Caption := 'Niedriger Ladezustand'; 4 : Label2.Caption := 'Kritischer Ladezustand'; 8 : Label2.Caption := 'Die Batterie wird geladen'; 128: Label2.Caption := 'Es existiert keine System-Batterie'; 255: Label2.Caption := 'Unbekannter Status'; end; // Ladezustand in Prozent if BatteryLifePercent <> 255 then Label3.Caption := IntToStr(BatteryLifePercent) + ' %' else Label3.Caption := 'Unbekannter Status'; end; end; Zitat:
Zitat:
Zitat:
Delphi-Quellcode:
type
TForm1 = class(TForm) private procedure WMPowerBroadcast(var Msg: TMessage); message WM_POWERBROADCAST; end; ... procedure TForm1.WMPowerBroadcast(var Msg: TMessage); begin if Msg.WParam = PBT_APMPOWERSTATUSCHANGE then begin // Der Akkustatus hat sich geändert // Führen Sie hier den Code aus, der auf diese Änderung reagieren soll end; end; Zitat:
|
AW: Akkumanagement (Notifications)
Diese Message kommt nicht bei einer Änderung des Ladezustands, sondern nur bei größeren Änderungen wie "low power" oder "Ladekabel getrennt".
|
AW: Akkumanagement (Notifications)
Mir ist aber so, als hätte ich bei früheren Versuchen auch dann eine Message bekommen.
Auf WM_POWERBROADCAST reagiere ich bereits und führe dort auch die Erkennungs-/Aktualisierungsfunktion aus. Aktuell bekomme ich nur beim Ändern des AC/DC eine Meldung, aber nicht wenn sich der Akkustand ändert, also Prozente/Restzeit ... nichtmal wenn es auf Kritisch oder so fällt. Ohne den zusätzlichen Timer bekomme ich also nicht wirklich alles Wichtige mit, drum die Frage hier. :cry: Alle derzeit implementierten Events werden rechts geloggt. (aktuell sogar der RefreshTimer, auch wenn dort nur der letzte Zustand angezeigt wird, damit das Log nicht zumüllt) Das GetSystemPowerStatus nutzte ich ebenfalls (und auch noch ein paar Alternativen/Zusätzliches, aber grundsätzlich würde ich mich darauf beschränken wollen). Anhang siehe Post #6. PS: Das BatteryFlag ist "offiziell" ein BitSet. Ja, ich weiß, dass Viele es wie einen Enum ausweten, aber Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:53 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