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 (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 |
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 19:35 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz