![]() |
Laptop Stromalarm
Hey und hallo!
Ich suche jetzt schon seit längerem das hier (meines Erachtens nach :gruebel: ) in der Delphi-PRAXiS wirklich vorhandene Projekt... Ich weiß nicht mehr genau wie sich das nennt, aber die Idee war, dass ein "Alarm" ausgelöst wird, wenn bei dem Notebook das Stromkabel abgestöpselt ( ;) ) wird. Genau so etwas brauche ich jetzt - am besten mit sourceCode :zwinker: Weiß jemand, wo ich das finde? Wo das ist? Hat das jemand? Kann mir das einer schicken? Den Link finden? |
Re: Laptop Stromalarm
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. |
Re: Laptop Stromalarm
Ab Win2000 werden auch Messages gesendet mit denen man eine Menge anstellen kann:
Delphi-Quellcode:
Ich hoffe das läuft...
...
procedure PowerMessage(var msg: TMessage); message WM_POWERBROADCAST; ... procedure TForm1.PowerMessage(var msg: TMessage); var status: TSystemPowerStatus; begin if msg.WParam = PBT_APMPOWERSTATUSCHANGE then begin if GetSystemPowerStatus(status) then begin case status.ACLineStatus of 0: //Offline = Akkubetrieb 1: //Online = Netzbetrieb else //unbekannter Status end; end; //evtl. GetLastError end; end; ... P.S.: Bei Vista gibts auch noch eine Möglichkeit einen speziellen Handler zu registrieren. Beispiel kann ich falls gewünscht nachreichen. |
Re: Laptop Stromalarm
Ja, ein Beispiel ist gewünscht :-)
|
Re: Laptop Stromalarm
Zitat:
|
Re: Laptop Stromalarm
Zitat:
Delphi-Quellcode:
Ungetestet, hab keinen Laptop (aufem PC gibts aber kein Beep, daher sollte es funktionieren)
function UsesBattery:boolean;
var SystemPowerStatus: TSystemPowerStatus; begin GetSystemPowerStatus(SystemPowerStatus); result := (SystemPowerStatus.ACLineStatus = 0); end; procedure TForm1.Timer1Timer(Sender: TObject); begin if UsesBattery then Beep; end; |
Re: Laptop Stromalarm
Zitat:
|
Re: Laptop Stromalarm
Sorry, dass ich mich erst jetzt melde... hab den Thread aus den Augen verloren.
Zitat:
Nun aber zum Thema: Zitat:
Delphi-Quellcode:
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 :stupid:
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; ... 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 ( ![]() ![]() 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 |
Re: Laptop Stromalarm
Sieht soweit alles prima aus, bis auf folgende Stelle:
Delphi-Quellcode:
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.
var pb_setting: TPowerbroadcastSetting;
buf: DWord; begin if msg.WParam = PBT_POWERSETTINGCHANGE then begin pb_setting := PPowerbroadcastSetting(msg.LParam)^; Statt TPower... lieber direkt PPower... verwenden:
Delphi-Quellcode:
Dann gibt's auch keine Probleme.
var pb_setting: PPowerbroadcastSetting;
buf: DWord; begin if msg.WParam = PBT_POWERSETTINGCHANGE then begin pb_setting := PPowerbroadcastSetting(msg.LParam); |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:02 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 by Thomas Breitkreuz