12 Stimmen

Wie kann man feststellen, ob der Laptop mit Batterien betrieben wird?

Wie kann man (von Delphi aus) erkennen, ob der Laptop mit Batterien (oder Wechselstrom) betrieben wird?

17voto

Reallyethical Punkte 1765

Um benachrichtigt zu werden, wenn sich der Status unter Vista und Windows 7 ändert, können Sie Folgendes verwenden RegisterPowerSettingNotification .

Für Windows 2000 und höher, siehe GetSystemPowerStatus oder gehen Sie zu MSDN und lesen Sie über Energieverwaltung .

(Irgendjemand postet immer, während ich gerade tippe :-( )

function GetBattery : Boolean;
var
  SysPowerStatus: TSystemPowerStatus;
begin
  Win32Check(GetSystemPowerStatus(SysPowerStatus));
  case SysPowerStatus.ACLineStatus of
    0: Result := False;
    1: begin
      Result := True;
      // You can return life with
      // String := Format('Battery power left: %u percent.', SysPowerStatus.BatteryLifePercent]);
    end;
    else
      raise Exception.Create('Unknown battery status');
  end;
end;

2voto

mrduclaw Punkte 3814

Ich glaube, es gibt eine WINAPI-Funktion, die dies tut, GetSystemPowerStatus die man, glaube ich, von Delphi aus ausführen kann.

2voto

volvox Punkte 1174

Hier ein Teil des Codes, der erkennt, wenn der Laptop mit Batterien betrieben wird (wenn nicht, wird ein Ereignis ausgelöst):

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  WTSSessionNotification, StdCtrls, MediaPlayer, Buttons, ShellAPI, Settings,
  ExtCtrls;

const
  WM_ICONTRAY = WM_USER + 1;

type
  TSettingsForm = class(TForm)
    OpenDialog: TOpenDialog;
    pnl1: TPanel;
    InfoLabel: TLabel;
    grp1: TGroupBox;
    AlarmSoundLabel: TLabel;
    lbl1: TLabel;
    checkIfLocked: TCheckBox;
    Filename: TEdit;
    Browse: TBitBtn;
    TestSound: TBitBtn;
    btn1: TBitBtn;
    lbl2: TLabel;
    procedure Minimize(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure TestSoundClick(Sender: TObject);
    procedure BrowseClick(Sender: TObject);
    procedure checkIfLockedClick(Sender: TObject);
    procedure OpenHomepage(Sender: TObject);
    procedure btn1Click(Sender: TObject);
  private
    TrayIconData: TNotifyIconData;
    procedure CheckForAC;
  protected
    procedure WndProc(var Message: TMessage); override;
  public
    { Public declarations }
  Function SecuredLockWorkStation : Boolean ;
  end;

var
  SettingsForm: TSettingsForm;

implementation

{$R *.DFM}
{$R WindowsXP.RES}

var
   MPlayer: TMPlayer;
   mySettings: TSettings;
   isLocked: boolean = false;

// true if A/C is connected, false if not
function ACConnected: boolean;
var PowerStatus: TSystemPowerStatus;
begin
 GetSystemPowerStatus(PowerStatus);
 result := (PowerStatus.ACLineStatus = 1);
end;

// handles application.minimize; do not really
// minimize, but hide settings window
procedure TSettingsForm.Minimize(Sender: TObject);
begin
 Application.Restore;
 self.Hide;
end;

// processes window messages (notification about
// power status changes, locking of workstation and
// tray icon activity)
procedure TSettingsForm.WndProc(var Message: TMessage);
begin
  case Message.Msg of
    WM_WTSSESSION_CHANGE:
      begin
        if Message.wParam = WTS_SESSION_LOCK then
         isLocked := true;
        if Message.wParam = WTS_SESSION_UNLOCK then
        begin
         isLocked := false;
         if MPlayer.isPlaying then
          MPlayer.Close;
        end;
      end;
    WM_POWERBROADCAST:
      begin
       if (isLocked) or (checkIfLocked.checked=false) then
        CheckForAC;
      end;
    WM_ICONTRAY:
      begin
         case Message.lParam of
          WM_LBUTTONDOWN:
            begin
              if SettingsForm.visible then
               SettingsForm.Hide
              else
               SettingsForm.Show;
            end;
          WM_RBUTTONUP:
            begin
              if SettingsForm.visible then
               SettingsForm.Hide
              else
               SettingsForm.Close;
            end;
         end;
      end;
  end;
  inherited;
end;

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X