WM_POWERBROADCAST empfangen
-
- Beiträge: 462
- Registriert: Mi 30. Jul 2008, 13:11
- OS, Lazarus, FPC: WinXP SP3 (L 0.9.28.2 FPC 2.2.4)
- CPU-Target: 32Bit
- Kontaktdaten:
WM_POWERBROADCAST empfangen
Ich möchte in meinem Programm die WM_POWERBROADCAST Message verarbeiten. Diese wird nur an den Hauptthread meiner Application gesendet. In Form1.WndProc kommt sie nicht an. Da Application selbst keine entsprechende Methode bereitstellt, muss die "oberste" WndProc wohl woanders liegen. Momentan kann ich sie über einen Hook empfangen, aber das ist ja keine besonders elegante Lösung. Wie sieht die elegante Lösung aus?
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!
-
- Beiträge: 512
- Registriert: Mo 25. Aug 2008, 18:17
- OS, Lazarus, FPC: ArchLinux x86, WinVista x86-64, Lazarus 0.9.29, FPC 2.4.1
- CPU-Target: x86
- Wohnort: Chemnitz
Re: WM_POWERBROADCAST empfangen
Wieso ist das nicht elegant? Genau dafür sind Hooks doch da 

-
- Beiträge: 462
- Registriert: Mi 30. Jul 2008, 13:11
- OS, Lazarus, FPC: WinXP SP3 (L 0.9.28.2 FPC 2.2.4)
- CPU-Target: 32Bit
- Kontaktdaten:
Re: WM_POWERBROADCAST empfangen
Hier der Originalthread dieser Problematik: http://www.spotlight.de/zforen/dlp/m/dl ... 13718.html
Es muss ja irgendwo eine WndProc geben, die diese Messages empfängt. Elegant wäre sicherlich sie von dort aus auszuwerten, wenn man denn rankommt.
Es muss ja irgendwo eine WndProc geben, die diese Messages empfängt. Elegant wäre sicherlich sie von dort aus auszuwerten, wenn man denn rankommt.
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!
-
- Beiträge: 3444
- Registriert: Mo 11. Sep 2006, 10:24
- OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
- CPU-Target: X32 / X64 / ARMv5
- Wohnort: Krefeld
Re: WM_POWERBROADCAST empfangen
Ein Thread hat keine Message-Queue und kann deshalb nicht "automatisch" auf Ereignisse reagieren. Deshalb muss man Zustand-Änderungen in der Mainloop des Threads (wenn es ein zyklischer Thread ist) abfragen. Es nützt also nix, dem Thread ein Fenster zuzuordnen, dass eine Message empfangen würde, es sei denn der Thread wartet mit einem API-Call auf die Message und tut in der Zeit nichts sinnvolles.
-Michael
-Michael
-
- Beiträge: 462
- Registriert: Mi 30. Jul 2008, 13:11
- OS, Lazarus, FPC: WinXP SP3 (L 0.9.28.2 FPC 2.2.4)
- CPU-Target: 32Bit
- Kontaktdaten:
Re: WM_POWERBROADCAST empfangen
Also entweder sind hier Missverständnisse aufgetreten, oder ich kann euch nicht folgen. Die Wurzel meines Problems liegt nicht im Handling von Threads, sondern dass ich überhaupt nicht weiß, wie ich an diese Message rankomme, außer mit dem Hook.
Szenario: Ich habe ein neues Projekt erstellt mit File -> New -> Application. Meine Anwendung soll nichts anderes tun, als mir eine Messagebox (ShowMessage('jetzt');) anzuzeigen, wenn eine WM_POWERBROADCAST Message eintrifft. Keine Threads oder sonstwas im Programm. Form1.WndProc empfängt keine WM_POWERBROADCAST Messages. Sind ein Hook und ein blockierender API-Call (wenn ich mschnell richtig verstanden habe) die einzigen Möglichkeiten an diese Messages heranzukommen?
Szenario: Ich habe ein neues Projekt erstellt mit File -> New -> Application. Meine Anwendung soll nichts anderes tun, als mir eine Messagebox (ShowMessage('jetzt');) anzuzeigen, wenn eine WM_POWERBROADCAST Message eintrifft. Keine Threads oder sonstwas im Programm. Form1.WndProc empfängt keine WM_POWERBROADCAST Messages. Sind ein Hook und ein blockierender API-Call (wenn ich mschnell richtig verstanden habe) die einzigen Möglichkeiten an diese Messages heranzukommen?
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!
-
- Beiträge: 3444
- Registriert: Mo 11. Sep 2006, 10:24
- OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
- CPU-Target: X32 / X64 / ARMv5
- Wohnort: Krefeld
Re: WM_POWERBROADCAST empfangen
Oops, Ich hatte nur "Thread" gelesen und darauf vorschnell reagiert.
Im Mainthrfead kannst Du im Mainform eine "procedure .... message" definieren, um Windows-Messages zu empfangen.
-Michael
Im Mainthrfead kannst Du im Mainform eine "procedure .... message" definieren, um Windows-Messages zu empfangen.
-Michael
-
- Beiträge: 462
- Registriert: Mi 30. Jul 2008, 13:11
- OS, Lazarus, FPC: WinXP SP3 (L 0.9.28.2 FPC 2.2.4)
- CPU-Target: 32Bit
- Kontaktdaten:
Re: WM_POWERBROADCAST empfangen
WM_ACTIVATE kann man auf diese Weise empfangen, aber WM_POWERBROADCAST kommt nicht an.
Code: Alles auswählen
procedure Test(var Msg: TMessage); message [WM_ACTIVATE|WM_POWERBROADCAST];
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!
-
- Beiträge: 3444
- Registriert: Mo 11. Sep 2006, 10:24
- OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
- CPU-Target: X32 / X64 / ARMv5
- Wohnort: Krefeld
Re: WM_POWERBROADCAST empfangen
Versuch's 'mal mit einzelnen Message Prozeduren statt mit einer für beide Messages. Es gab 'mal eine Diskussion darüber, ob Lazarus da einen Bug hat....
-Michael
-Michael
-
- Beiträge: 462
- Registriert: Mi 30. Jul 2008, 13:11
- OS, Lazarus, FPC: WinXP SP3 (L 0.9.28.2 FPC 2.2.4)
- CPU-Target: 32Bit
- Kontaktdaten:
Re: WM_POWERBROADCAST empfangen
Was ich da geschrieben hab, ist do so keine Syntax die FPC akzeptiert
Es soll lediglich ausdrücken, dass ich die eine oder die andere Message dort hinschreibe.
Mit einem Hook funktioniert es einwandfrei. Ich habe mal ein komplettes Testprojekt mit beiden Implementierungen angehangen.

Code: Alles auswählen
procedure Test(var Msg: TMessage); message WM_ACTIVATE; // wird ausgelöst
procedure Test(var Msg: TMessage); message WM_POWERBROADCAST; // wird nicht ausgelöst bei Standby
- Dateianhänge
-
Test.zip
- Testprojekt
- (88.82 KiB) 66-mal heruntergeladen
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!