Как определить, когда ноутбук работает от батарей?

Как обнаружить (из Delphi), когда ноутбук работает от батарей (или переменного тока)?

Ответ 1

Чтобы получать уведомления о статусе изменений в Vista и Windows 7, вы можете использовать RegisterPowerSettingNotification.

Для Windows 2000 и более поздних версий просмотрите GetSystemPowerStatus или перейдите в MSDN и прочитайте Управление питанием.

(Кто-то всегда публикует сообщения, когда я набираю:-()

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;

Ответ 2

Там есть функция WINAPI, которая, как я считаю, делает это, GetSystemPowerStatus, который, я считаю, можно выполнить из Delphi.

Ответ 3

Здесь часть кода, который обнаруживает, когда ноутбук работает на аккумуляторах (если он не вызывает какое-либо событие):

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;