Einzelnen Beitrag anzeigen

Benutzerbild von Mr_G
Mr_G

Registriert seit: 2. Sep 2004
Ort: Duisburg
468 Beiträge
 
Delphi 2006 Professional
 
#8

Re: Laptop Stromalarm

  Alt 13. Okt 2008, 14:12
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
Jan
  Mit Zitat antworten Zitat