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