Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   Laptop Stromalarm (https://www.delphipraxis.net/122236-laptop-stromalarm.html)

kroete 11. Okt 2008 23:03


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?

Flips 12. Okt 2008 00:03

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.

Mr_G 12. Okt 2008 01:42

Re: Laptop Stromalarm
 
Ab Win2000 werden auch Messages gesendet mit denen man eine Menge anstellen kann:
Delphi-Quellcode:
...
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;
...
Ich hoffe das läuft...

P.S.: Bei Vista gibts auch noch eine Möglichkeit einen speziellen Handler zu registrieren. Beispiel kann ich falls gewünscht nachreichen.

SirThornberry 12. Okt 2008 07:17

Re: Laptop Stromalarm
 
Ja, ein Beispiel ist gewünscht :-)

hamburcher 12. Okt 2008 07:36

Re: Laptop Stromalarm
 
Zitat:

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 :oops:

Flips 12. Okt 2008 16:27

Re: Laptop Stromalarm
 
Zitat:

Zitat von hamburcher
Zitat:

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 :oops:

Bitteschön:
Delphi-Quellcode:
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;
Ungetestet, hab keinen Laptop (aufem PC gibts aber kein Beep, daher sollte es funktionieren)

mkinzler 12. Okt 2008 16:30

Re: Laptop Stromalarm
 
Zitat:

Zitat von hamburcher
Zitat:

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 :oops:

Dann beachte du das auch. dein Beitrag hat (genauso wie mein Spambeitrag jetzt) keinen Mehrwert!

Mr_G 13. Okt 2008 14:12

Re: Laptop Stromalarm
 
Sorry, dass ich mich erst jetzt melde... hab den Thread aus den Augen verloren.
Zitat:

Zitat von mkinzler
Zitat:

Zitat von hamburcher
Zitat:

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 :oops:

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:

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 :stupid:
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

tirips 2. Mär 2009 22:23

Re: Laptop Stromalarm
 
Sieht soweit alles prima aus, bis auf folgende Stelle:

Delphi-Quellcode:
var pb_setting: TPowerbroadcastSetting;
    buf: DWord;
begin
  if msg.WParam = PBT_POWERSETTINGCHANGE then
  begin
    pb_setting := PPowerbroadcastSetting(msg.LParam)^;
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.

Statt TPower... lieber direkt PPower... verwenden:

Delphi-Quellcode:
var pb_setting: PPowerbroadcastSetting;
    buf: DWord;
begin
  if msg.WParam = PBT_POWERSETTINGCHANGE then
  begin
    pb_setting := PPowerbroadcastSetting(msg.LParam);
Dann gibt's auch keine Probleme.


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