Comment détecter (de Delphi) lorsque l'ordinateur portable est en cours d'exécution sur les piles (ou AC)? P>
3 Réponses :
Il y a une fonction winapi que je crois que cela, GetSystemPowerstatus , que je crois que vous pouvez exécuter de Delphi. P>
Pour être averti lorsque l'état change sur Vista et Windows 7, vous pouvez utiliser RegisterPowserSettingNotification Code> .
Pour Windows 2000 et plus tard, regardez getSystemPowerstatus code> ou accédez à msdn et lisez sur Gestion de l'alimentation . P>
(quelqu'un publie toujours pendant que je tape :-() p>
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;
Oui, c'est la nature de si. C'est encore plus difficile lorsque votre anglais natif n'est pas anglais (mon cas). Vous devez juste m'y habituer :-). Je me souviens d'une discussion dans meta
Il suffit de tester ce code sur Windows 7 et ça marche !! C'était une surprise.
@Gmonc Votre droit je devrais me calmer, mais pour être franc, je m'habitue à la vitesse de ce site. Il semble presque inutile d'afficher que d'autres ont la même idée que moi.
Essayez-vous de coder dans la syntaxe de Brainfe * CK? Pourquoi pas seulement le résultat: = pas booléen (sspowerstatus.aclinestatus). Vous testez une condition pour true, puis retournez false ... O_O
Comme le point entier est celui-ci peut être basculé vers une procédure ou une fonction peut changer pour retourner STRI, etc. dans quelques minuscules changements. c'est un exemple pas une solution complète !!
Aclinestatus est documenté pour avoir trois b> valeurs possibles, alors ne le mettez pas à Boolean. Vérifiez simplement les valeurs 0 et 1, et laissez tout le reste être une erreur. En outre, veuillez vérifier la valeur de retour de GetSystemPowerstatus. J'ai édité la réponse en conséquence.
Cela fonctionne sur WinXP - Testé et confirmé. Merci vraimentthical. (Veuillez ajouter plus de confirmations si vous l'avez testé sur un système d'exploitation différent).
Voici une partie du code qui détecte lorsque l'ordinateur portable s'exécute sur des piles (si ce n'est pas déclenche un événement):
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;