Sieht soweit alles prima aus, bis auf folgende Stelle:
Delphi-Quellcode:
var pb_setting: TPowerbroadcastSetting;
buf: DWord;
begin
if msg.WParam = PBT_POWERSETTINGCHANGE then
begin
pb_setting := PPowerbroadcastSetting(msg.LParam)^;
da pb_setting als TPower... deklariert ist kopiert die letzte Anweisung den TPower... Record aus dem LParam. Dabei wird nach Definition kopiert, also auch nur ein Byte für Data - dort stehen aber ggf. mehr Bytes (im Beispiel ja 4) - mit Glück fällt das nicht auf, mit Pech (und das ist wahrscheinlicher) liefert es falsche Ergebnisse.
Statt TPower... lieber direkt PPower... verwenden:
Delphi-Quellcode:
var pb_setting: PPowerbroadcastSetting;
buf: DWord;
begin
if msg.WParam = PBT_POWERSETTINGCHANGE then
begin
pb_setting := PPowerbroadcastSetting(msg.LParam);
Dann gibt's auch keine Probleme.