How to detect when the laptop is running on batteries?

前端 未结 3 804
萌比男神i
萌比男神i 2021-02-08 07:27

How to detect (from Delphi) when the laptop is running on batteries (or AC)?

相关标签:
3条回答
  • 2021-02-08 07:33

    There's a WINAPI function that I believe does this, GetSystemPowerStatus, which I believe you can execute from Delphi.

    0 讨论(0)
  • 2021-02-08 07:38

    Here part of code that detect when laptop is running on batteries (if not it triggers some event):

    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;
    
    0 讨论(0)
  • 2021-02-08 07:50

    To be notified when the status changes on Vista and Windows 7 you can use RegisterPowerSettingNotification.

    For Windows 2000 and later, look at GetSystemPowerStatus, or go to MSDN and read about Power Management.

    (Someone always posts while I am typing :-( )

    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;
    
    0 讨论(0)
提交回复
热议问题