Sorry, dass ich mich erst jetzt melde... hab den Thread aus den Augen verloren.

Zitat von
mkinzler:

Zitat von
hamburcher:

Zitat von
Flips:
Kannste dir doch selbst schnell schreiben, du kannst mit Delphi prüfen, ob das Notebook per Akku oder Netzstecker läuft.
Mach nen Timer, der das alle X Sekunden prüft und fertig.
Noch einfacher als Programmieren ist Herumschwafeln

Dann beachte du das auch. dein Beitrag hat (genauso wie mein Spambeitrag jetzt) keinen Mehrwert!
Spam ist irgendwie ein Teufelskreis!
Nun aber zum Thema:

Zitat von
SirThornberry:
Ja, ein Beispiel ist gewünscht

Ich hab das Ganze in der
MSDN gefunden und wie folgt übersetzt:
Delphi-Quellcode:
const GUID_ACDC_POWER_SOURCE: TGUID = '
{5D3E9A59-E9D5-4B00-A6BD-FF34FF516548}';
PBT_POWERSETTINGCHANGE = 32787;
type
PPowerbroadcastSetting = ^TPowerbroadcastSetting;
POWERBROADCAST_SETTING =
packed record
PowerSetting: TGUID;
DataLength: DWord;
Data:
array[0..0]
of Char;
end;
{$EXTERNALSYM POWERBROADCAST_SETTING}
TPowerbroadcastSetting = POWERBROADCAST_SETTING;
{$EXTERNALSYM RegisterPowerSettingNotification}
function RegisterPowerSettingNotification(hRecipient: THandle;
PowerSettingGUID: PGUID; Flags: DWord): THandle;
stdcall;
{$EXTERNALSYM UnregisterPowerSettingNotification}
function UnregisterPowerSettingNotification(
Handle: THandle): BOOL;
stdcall;
...
type
TForm1 =
class(TForm)
...
psn: THandle;
procedure PowerMessage(
var msg: TMessage);
message WM_POWERBROADCAST;
...
end;
...
procedure TForm1.FormCreate(Sender: TObject);
begin
psn := RegisterPowerSettingNotification(Form1.Handle, @GUID_ACDC_POWER_SOURCE , 0);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
UnregisterPowerSettingNotification(psn);
end;
...
procedure TForm1.PowerMessage(
var msg: TMessage);
var pb_setting: TPowerbroadcastSetting;
buf: DWord;
begin
if msg.WParam = PBT_POWERSETTINGCHANGE
then
begin
pb_setting := PPowerbroadcastSetting(msg.LParam)^;
if GUIDToString(pb_setting.PowerSetting) = GUIDToString(GUID_ACDC_POWER_SOURCE)
then
begin
buf := 0;
move(pb_setting.Data, buf, SizeOf(DWord));
case buf
of
0: Showmessage('
Netzbetrieb');
1: Showmessage('
Akkubetrieb');
2: Showmessage('
USV-Betrieb');
end;
end;
end;
end;
...
Vorweg: Ich habe nicht so viel Erfahrung mit der
WinAPI und kann daher nicht dafür garantieren, dass der Code so hochwertig ist wie man das von den
DP-Profis kennt, bei mir hat er aber funktioniert

Der Unterschied dieser Vista-Ausführung zu der anderen Version liegt in der Art der Kontaktierung: Man registriert eine PowerSettingNotification und übergibt die
GUID des zu überwachden Ereignisses (
Liste weiterer Ereignis-GUIDs). Hierbei kann die Benachrichtung für ein Fenster oder einen Service registriert werden (
weitere Informationen). Das Fenster wird nun auch via WM_POWERBROADCAST informiert, wobei dann WParam = PBT_POWERSETTINGCHANGE ist. LParam enthält nun den Zeiger auf die POWERBROADCAST_SETTING-Struktur, aus der man die Infos über das aufgetretene Ereignis (anhand der
GUID) und weitere Daten zum Ereignis erhält. Die Daten sind dann je nach Event zu interpretieren.
Der Vorteil dieser Variante ist wohl, dass man auch einen Service ohne Nachrichtenschleife registrieren kann.
Ich hoffe das stimmt nun alles so.
Gruß
Mr_G