AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi WM_POWERBROADCAST wie verwenden?
Thema durchsuchen
Ansicht
Themen-Optionen

WM_POWERBROADCAST wie verwenden?

Ein Thema von ULIK · begonnen am 30. Okt 2019 · letzter Beitrag vom 4. Mai 2020
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von ULIK
ULIK

Registriert seit: 25. Sep 2006
Ort: Regensburg
427 Beiträge
 
Delphi 11 Alexandria
 
#1

WM_POWERBROADCAST wie verwenden?

  Alt 30. Okt 2019, 10:01
Hallo,

ich habe eine wirklich dumme Frage: ich habe eine kleine Testanwendung, die nichts weiter machen soll, als auf WM_POWERBROADCAST Messages zu hören und in ein Memo zu schreiben, was empfangen wurde.

Delphi-Quellcode:
procedure TForm1.WMPowerbroadcast(var Message: TMessage);
begin
  memLog.Lines.Add('PowerBroadcast received');

  case Message.WParam of
    PBT_APMQUERYSUSPEND: memLog.Lines.Add('PBT_APMQUERYSUSPEND');
    PBT_APMQUERYSTANDBY: memLog.Lines.Add('PBT_APMQUERYSTANDBY');
    PBT_APMQUERYSUSPENDFAILED: memLog.Lines.Add('PBT_APMQUERYSUSPENDFAILED');
    PBT_APMQUERYSTANDBYFAILED : memLog.Lines.Add('PBT_APMQUERYSTANDBYFAILED');
    PBT_APMSUSPEND: memLog.Lines.Add('PBT_APMSUSPEND');
    PBT_APMSTANDBY: memLog.Lines.Add('PBT_APMSTANDBY');
    PBT_APMRESUMECRITICAL: memLog.Lines.Add('PBT_APMRESUMECRITICAL');
    PBT_APMRESUMESUSPEND: memLog.Lines.Add('PBT_APMRESUMESUSPEND');
    PBT_APMRESUMESTANDBY: memLog.Lines.Add('PBT_APMRESUMESTANDBY');
    PBT_APMBATTERYLOW: memLog.Lines.Add('PBT_APMBATTERYLOW');

    PBT_APMPOWERSTATUSCHANGE: memLog.Lines.Add('PBT_APMPOWERSTATUSCHANGE');
    PBT_APMOEMEVENT: memLog.Lines.Add('PBT_APMOEMEVENT');
    PBT_APMRESUMEAUTOMATIC: memLog.Lines.Add('PBT_APMRESUMEAUTOMATIC');
  end;
end;
Wenn ich das unter W10 laufen lassen und dann den Rechner in den Energiesparmodus oder Ruhemodus versetze, dann wird rein gar nichts aufgezeichnet. Auch ein Zuklappen des Laptopdeckels scheint keine Message zu generieren. Einzig wenn man das Netzteil an/absteckt, dann wir eine Message mit PBT_APMPOWERSTATUSCHANGE empfangen.

Ich nehm an, ich mach irgendeinen Fehler, nur welchen? Ich steh grad völlig auf dem Schlauch.

Ach so: Delphi ist XE 10.2.3

Geändert von ULIK (30. Okt 2019 um 10:02 Uhr) Grund: Delphiversion ergänzt
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
981 Beiträge
 
Delphi 6 Professional
 
#2

AW: WM_POWERBROADCAST wie verwenden?

  Alt 30. Okt 2019, 14:16
Hmm

Lies mal hier zu PBT_APMQUERYSUSPEND:

https://docs.microsoft.com/en-us/win...pmquerysuspend

Zitat:
Support for this event was removed in Windows Vista
https://docs.microsoft.com/en-us/win...powerbroadcast

WM_POWERBROADCAST scheint auch nur noch folgende event identifiers zu unterstützen:

PBT_APMPOWERSTATUSCHANGE
PBT_APMRESUMEAUTOMATIC
PBT_APMRESUMESUSPEND
PBT_APMSUSPEND
PBT_POWERSETTINGCHANGE


Auch kann seit Vista hiermit kein Suspend mehr damit unterbunden werden...
(Ja ich Verwende Delphi 6 Pro und will NICHT wechseln!)
  Mit Zitat antworten Zitat
Benutzerbild von ULIK
ULIK

Registriert seit: 25. Sep 2006
Ort: Regensburg
427 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: WM_POWERBROADCAST wie verwenden?

  Alt 30. Okt 2019, 14:48
Danke für den Hinweis. Inzwischen bin ich auch schlauer: selbst
PBT_APMRESUMEAUTOMATIC
PBT_APMRESUMESUSPEND
PBT_APMSUSPEND
werden nicht empfangen. Damit das wieder geht muß sich die Anwendung mit RegisterSuspendResumeNotification anmelden und entsprechend wieder abmelden (UnRegisterSuspendResumeNotification). Dies wäre angeblich seit Windows 8 so.
Dummerweise ist diese API nicht in Delphi 10.2 enthalten. Hab das mal selbst gemacht und siehe da, schon werden beim Schließen des Laptopdeckels wieder PBT_APMSUSPEND und anschließend beim Öffnen PBT_APMRESUMEAUTOMATIC und PBT_APMRESUMESUSPEND empfangen.

Hier mal etwas Code:
Delphi-Quellcode:
var
  hLibrary: THandle = 0;

  RegisterSuspendResumeNotification: function(hRecipient: THandle; flags: DWORD): HPOWERNOTIFY; stdcall = nil;
  UnRegisterSuspendResumeNotification: function(hNotification: HPOWERNOTIFY): Bool; stdcall = nil;

...

  hLibrary := LoadLibrary('user32.dll');
  if hLibrary <> 0 then
  begin
    RegisterSuspendResumeNotification := GetProcAddress(hLibrary, 'RegisterSuspendResumeNotification');
    UnRegisterSuspendResumeNotification := GetProcAddress(hLibrary, 'UnregisterSuspendResumeNotification');
  end;
Der Aufruf erfolgt dann z.B. im FormCreate mit hNotification := RegisterSuspendResumeNotification(Handle, DEVICE_NOTIFY_WINDOW_HANDLE); ; entsprechend dann UnRegisterSuspendResumeNotification(hNotification) im FormDestroy


Frohes Schaffen!
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
3.034 Beiträge
 
Delphi 12 Athens
 
#4

AW: WM_POWERBROADCAST wie verwenden?

  Alt 30. Okt 2019, 17:17
Wo in die Delphi RTL würden diese fehlenden API Deklarationen rein gehören?
Macht es Sinn, einen QP Feature request dazu zu erfassen?
  Mit Zitat antworten Zitat
Alt 30. Okt 2019, 17:32     Erstellt von Frühlingsrolle
Dieser Beitrag wurde von Daniel gelöscht. - Grund: Verdacht auf SPAM und den damit verbundenen verschwenderischen Umgang von wertvollen Bits und Bytes
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
3.034 Beiträge
 
Delphi 12 Athens
 
#6

AW: WM_POWERBROADCAST wie verwenden?

  Alt 30. Okt 2019, 20:38
Dann darf mal jemand von euch einen QP feature request
zur Aufnahme dieser WinAPI Funktionen schreiben. Ich tu's
nicht, da kenne ich mich ein wenig zu wenig aus und habe
außerdem eh' schon sehr viele QP reports

=> Freiwillige vor, damit das demnächst "out of the box" geht!

Grüße

TurboMagic
  Mit Zitat antworten Zitat
Michael II

Registriert seit: 1. Dez 2012
Ort: CH BE Eriswil
771 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: WM_POWERBROADCAST wie verwenden?

  Alt 20. Dez 2019, 14:07
Danke für den Hinweis. Inzwischen bin ich auch schlauer: selbst
PBT_APMRESUMEAUTOMATIC
PBT_APMRESUMESUSPEND
PBT_APMSUSPEND
werden nicht empfangen.
Danke für deine Info. Aber: Ich verwende WM_POWERBROADCAST seit vielen Jahren in einem Onlinespiel ohne "RegisterSuspendResumeNotification" und es funktioniert auch im Insider Build Version 10.0.19041 (soeben getestet). Ich schliesse den Deckel, mein Programm empfängt WM_POWERBROADCAST wParam=PBT_APMSUSPEND. Ich öffne den Deckel und melde mich an und prüfe: Mein Programm empfängt zuerst PBT_APMRESUMESUSPEND und danach PBT_APMRESUMEAUTOMATIC. Dein Code aus #1 sollte also funktionieren.

Hast du eventuell bei der Deklaration message WM_POWERBROADCAST; vergessen (?).


Delphi-Quellcode:
type
  TMeinForm = class(TForm)
   ...
  procedure WMPowerBroadcast(var Msg: TMessage); message WM_POWERBROADCAST;


procedure TMeinForm.WMPowerBroadcast(var Msg: TMessage);
begin
  try
    case Msg.wParam of
    PBT_APMSUSPEND: ….
    PBT_APMRESUMESUSPEND: ….
    PBT_APMRESUMEAUTOMATIC: ….
Michael Gasser
  Mit Zitat antworten Zitat
Benutzerbild von ULIK
ULIK

Registriert seit: 25. Sep 2006
Ort: Regensburg
427 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: WM_POWERBROADCAST wie verwenden?

  Alt 20. Dez 2019, 15:34
Hallo,

Zitat:
Hast du eventuell bei der Deklaration message WM_POWERBROADCAST; vergessen (?).
das glaub ich nicht, denn PBT_APMPOWERSTATUSCHANGE ist ja durchgekommen. Im eigentlichen Programm war das auch schon mal alles funktionierend ohne das Register... eingebaut; ich bin darüber gestolpert, weil es auf einmal nicht mehr funktioniert hat. Entweder war das temporär bei Windows 10 deaktiviert und geht nun wieder oder es ist noch was anderes. Jedenfalls klappt's mit RegisterSuspendResumeNotification wieder


Frohe Weihnachten!
Uli
  Mit Zitat antworten Zitat
pwilly

Registriert seit: 22. Jun 2007
1 Beiträge
 
#9

AW: WM_POWERBROADCAST wie verwenden?

  Alt 4. Mai 2020, 07:41
Das Mysterium warum WM_POWERBROADCAST auf einmal nicht mehr funktioniert heist seit Windows 8 "Connected Standby" oder in Windows 10 "Modern Standby". Das wird von den neueren "always on" Devices wie z.B dem MS Surface Pro unterstütz. Hab nun etliche Stunden gesucht warum das bei mir auf dem Surface Pro nicht funktioniert aber auf meinem anderen Computer.

Der "Desktop Activity Moderator" DAM hat Schuld. The DAM thing Hier er Reference Link, ganz unten stehts:
https://docs.microsoft.com/en-us/win...vity-moderator

Ahoi Kollegen. Danke für die uPowerManagement unit!
  Mit Zitat antworten Zitat
amigage

Registriert seit: 11. Nov 2005
Ort: Leipzig
274 Beiträge
 
Delphi 12 Athens
 
#10

AW: WM_POWERBROADCAST wie verwenden?

  Alt 20. Dez 2019, 10:38
Hallo,

vielen Dank für den Thread. Dieser ist für mich sehr interessant, da ich mich aktuell auch mit dem Ermitteln von Ruhezustand und Erwachen beschäftige.
Mein Problem ist jedoch, dass ich kein Programm mit einem sichtbaren Fenster verwende, sondern einen Windows-Dienst. In dem Fall habe ich kein Handle des aktuellen Fensters.


Ich habe bereits im Netzt recherchiert und bin eigentlich nur auf "ist nicht möglich" gestoßen.
Aber es muss doch eine Möglichkeit geben, dass ein mit TService erstellter Dienst den Windows Ruhezustand ermitteln kann.

Über sachdienliche Hinweise würde ich mich freuen.

Gruß,
amigage
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:43 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