FAQ VCL
Железо\Батарея

:: Меню ::
:: На главную ::
:: FAQ ::
:: Заметки ::
:: Практика ::
:: Win API ::
:: Проекты ::
:: Скачать ::
:: Секреты ::
:: Ссылки ::

:: Сервис ::
:: Написать ::

:: MVP ::

:: RSS ::

Яндекс.Метрика

Как отследить смену питания на ноутбуке?

type
  TForm1 = class(TForm)
    {...}
    Memo1: TMemo;
    {...}
  private
    hNotifyPower: Pointer;
    hNotifyBattery: Pointer;
    procedure PowerBroadcast(var Msg: TMessage); message WM_POWERBROADCAST;
    {...}
  end;

{...}

implementation

procedure TForm1.Button1Click(Sender: TObject);
begin
  // Изменение типа питания
  hNotifyPower := RegisterPowerSettingNotification(Handle, GUID_ACDC_POWER_SOURCE, DEVICE_NOTIFY_WINDOW_HANDLE);
  // Изменение заряда батареи
  hNotifyBattery := RegisterPowerSettingNotification(Handle, GUID_BATTERY_PERCENTAGE_REMAINING, DEVICE_NOTIFY_WINDOW_HANDLE);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  UnregisterPowerSettingNotification(hNotifyPower);
  UnregisterPowerSettingNotification(hNotifyBattery);
end;

procedure TForm1.PowerBroadcast(var Msg: TMessage);
var
  PowerSetting: TPowerBroadcastSetting;
begin
  if Msg.WParam = PBT_POWERSETTINGCHANGE then
  begin
    PowerSetting := PPowerBroadcastSetting(Msg.lParam)^;

    if PowerSetting.PowerSetting = GUID_ACDC_POWER_SOURCE then
      case PowerSetting.Data[0] of
        0: Memo1.Lines.Add('питание от сети');
        1: Memo1.Lines.Add('питание от батареи');
        2: Memo1.Lines.Add('кратковременное питание от UPS или подобных устройств');
      end;

    if PowerSetting.PowerSetting = GUID_BATTERY_PERCENTAGE_REMAINING then
      Memo1.Lines.Add('текущий процент заряда: ' + PowerSetting.Data[0].ToString);
  end;
end;


Как узнать заряд батареи ноутбука?

procedure TForm1.Button1Click(Sender: TObject);
var
  PowerStatus: TSystemPowerStatus;
  Msg: string;
begin
  GetSystemPowerStatus(PowerStatus);

  case PowerStatus.ACLineStatus of
    0: Msg := 'Компьютер работает автономно (от батареи или ИБП)'#13#13;
    1: Msg := 'Компьютер работает от сети'#13#13;
  255: Msg := 'Не удалось определить статус подключения к сети'#13#13;
  end;

  // это поле является комбинацией флагов
  Msg := Msg + 'Общее состояние батареи:'#13;
  if (PowerStatus.BatteryFlag shr 7) and 1 = 1 then
    Msg := Msg + '  батарея не установлена или программа запущена на стационарном компьютере'#13
  else
  begin
    if PowerStatus.BatteryFlag and 1 = 1 then
      Msg := Msg + '  высокий уровень заряда (более 66%)'#13;
    if (PowerStatus.BatteryFlag shr 1) and 1 = 1 then
      Msg := Msg + '  низкий уровень заряда (менее 33%)'#13;
    if (PowerStatus.BatteryFlag shr 2) and 1 = 1 then
      Msg := Msg + '  критический уровень заряда (менее 5%)'#13;
    if PowerStatus.BatteryFlag and 7 = 0 then
      Msg := Msg + '  средний уровень заряда в диапазоне от 33% до 66% включительно'#13;
    if (PowerStatus.BatteryFlag shr 3) and 1 = 1 then
      Msg := Msg + '  батарея заряжается'#13;
  end;
  if PowerStatus.BatteryFlag = 255 then
    Msg := Msg + '  данные получить не удалось'#13;
  Msg := Msg + #13;

  if PowerStatus.BatteryLifePercent in [0..100] then
    Msg := Msg + 'осталось заряда: ' + PowerStatus.BatteryLifePercent.ToString + '%'
  else if PowerStatus.BatteryLifePercent = 255 then
    Msg := Msg + 'данные о оставшемся заряде получить не удалось, возможно программа запущена на стационарном компьютере';
  ShowMessage(Msg);
end;

При использовании материала - ссылка на сайт обязательна