Delphi 如何检测笔记本电脑何时使用电池运行?

Delphi 如何检测笔记本电脑何时使用电池运行?,delphi,Delphi,如何(从Delphi)检测笔记本电脑何时使用电池(或交流电)?我相信有一个WINAPI函数可以做到这一点,我相信您可以从Delphi执行该函数。当Vista和Windows 7上的状态发生变化时,您可以使用该函数 对于Windows 2000及更高版本,请查看或转到MSDN并阅读 (有人总是在我打字时发帖:-() 以下是检测笔记本电脑何时使用电池运行的部分代码(如果不是,则会触发一些事件): 是的,这就是SO的本质。如果你的母语不是英语(我的情况),那就更难了。你只需要习惯:-)。我记得在met

如何(从Delphi)检测笔记本电脑何时使用电池(或交流电)?

我相信有一个WINAPI函数可以做到这一点,我相信您可以从Delphi执行该函数。

当Vista和Windows 7上的状态发生变化时,您可以使用该函数

对于Windows 2000及更高版本,请查看或转到MSDN并阅读

(有人总是在我打字时发帖:-()


以下是检测笔记本电脑何时使用电池运行的部分代码(如果不是,则会触发一些事件):


是的,这就是SO的本质。如果你的母语不是英语(我的情况),那就更难了。你只需要习惯:-)。我记得在meta中有一次讨论,目的是为了避免在快速发布内容时变得如此“绝望”。刚刚在Windows7上测试了该代码,它就工作了!!这是一种支持。@GmonC你说的对,我应该冷静下来,但坦率地说,我已经习惯了这个网站的速度。因为其他人和我有相同的想法,所以发帖几乎毫无意义。你想用Brainf*ck的语法编码吗?为什么不只是结果:=非布尔值(SysPowerStatus.ACLineStatus)。您测试一个条件为True,然后返回False。。。O_oACLineStatus被记录为有三个可能的值,所以不要将其类型转换为Boolean。只需检查值0和1,其他一切都是错误的。另外,请检查GetSystemPowerStatus的返回值。我已相应地编辑了答案。
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;
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;