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

Я пытался решить эту проблему пару часов, используя рекурсивные функции, но в конце концов я понял, что нам вообще не нужна рекурсия. Ниже мой подход.

$search = array('key1','key2','key3');
$replace = array('newkey1','newkey2','newkey3');

$resArray = str_replace($search,$replace,json_encode($array));
$res = json_decode($resArray);

На этом пути мы можем избежать цикла и рекурсии.

Надеюсь, что это помогает.

11
задан WeGoToMars 28 October 2009 в 19:28
поделиться

3 ответа

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

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

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

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;
16
ответ дан 3 December 2019 в 06:22
поделиться

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

2
ответ дан 3 December 2019 в 06:22
поделиться

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

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;
1
ответ дан 3 December 2019 в 06:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: