11
votes

Comment détecter lorsque l'ordinateur portable est en cours d'exécution sur les piles?

Comment détecter (de Delphi) lorsque l'ordinateur portable est en cours d'exécution sur les piles (ou AC)?


0 commentaires

3 Réponses :


2
votes

Il y a une fonction winapi que je crois que cela, GetSystemPowerstatus , que je crois que vous pouvez exécuter de Delphi.


0 commentaires

16
votes

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;


7 commentaires

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 meta.stackexchange.com/questions/73/... Pour éviter d'être" désespéré "dans la publication de quelque chose de rapide.


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 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).



1
votes

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;


0 commentaires