AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte Laptop Stromalarm
Thema durchsuchen
Ansicht
Themen-Optionen

Laptop Stromalarm

Ein Thema von kroete · begonnen am 11. Okt 2008 · letzter Beitrag vom 2. Mär 2009
Antwort Antwort
kroete
Registriert seit: 28. Feb 2008
Hey und hallo!
Ich suche jetzt schon seit längerem das hier (meines Erachtens nach ) 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
Weiß jemand, wo ich das finde? Wo das ist? Hat das jemand? Kann mir das einer schicken? Den Link finden?
 
Flips

 
Delphi 7 Professional
 
#2
  Alt 12. Okt 2008, 00:03
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.
Philipp F.
  Mit Zitat antworten Zitat
Benutzerbild von Mr_G
Mr_G

 
Delphi 2006 Professional
 
#3
  Alt 12. Okt 2008, 01:42
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.
Jan
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry

 
Delphi 2006 Professional
 
#4
  Alt 12. Okt 2008, 07:17
Ja, ein Beispiel ist gewünscht
Jens
  Mit Zitat antworten Zitat
hamburcher
 
#5
  Alt 12. Okt 2008, 07:36
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
  Mit Zitat antworten Zitat
Flips

 
Delphi 7 Professional
 
#6
  Alt 12. Okt 2008, 16:27
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
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)
Philipp F.
  Mit Zitat antworten Zitat
mkinzler

 
Delphi 11 Alexandria
 
#7
  Alt 12. Okt 2008, 16:30
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!
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Mr_G
Mr_G

 
Delphi 2006 Professional
 
#8
  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
tirips
 
#9
  Alt 2. Mär 2009, 22:23
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.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:45 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