Wie kann man (von Delphi aus) erkennen, ob der Laptop mit Batterien (oder Wechselstrom) betrieben wird?
Antworten
Zu viele Anzeigen?Um benachrichtigt zu werden, wenn sich der Status unter Vista und Windows 7 ändert, können Sie Folgendes verwenden RegisterPowerSettingNotification
.
Für Windows 2000 und höher, siehe GetSystemPowerStatus
oder gehen Sie zu MSDN und lesen Sie über Energieverwaltung .
(Irgendjemand postet immer, während ich gerade tippe :-( )
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;
Ich glaube, es gibt eine WINAPI-Funktion, die dies tut, GetSystemPowerStatus die man, glaube ich, von Delphi aus ausführen kann.
Hier ein Teil des Codes, der erkennt, wenn der Laptop mit Batterien betrieben wird (wenn nicht, wird ein Ereignis ausgelöst):
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;