WM_POWERBROADCAST empfangen

Rund um die LCL und andere Komponenten
Antworten
RSE
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

Beitrag von RSE »

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!

Hitman
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

Beitrag von Hitman »

Wieso ist das nicht elegant? Genau dafür sind Hooks doch da ;-)

RSE
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

Beitrag von RSE »

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.
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!

mschnell
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

Beitrag von mschnell »

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

RSE
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

Beitrag von RSE »

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?
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!

mschnell
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

Beitrag von mschnell »

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

RSE
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

Beitrag von RSE »

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!

mschnell
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

Beitrag von mschnell »

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

RSE
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

Beitrag von RSE »

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.

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
Mit einem Hook funktioniert es einwandfrei. Ich habe mal ein komplettes Testprojekt mit beiden Implementierungen angehangen.
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!

Antworten