2009-10-28 13 views

Respuesta

15

Para recibir notificaciones cuando el estado cambie en Vista y Windows 7, puede usar RegisterPowerSettingNotification.

Para Windows 2000 y posterior, mira GetSystemPowerStatus, o ve a MSDN y lee sobre Power Management.

(Alguien siempre contabiliza mientras estoy escribiendo :-()

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; 
+0

Sí, esa es la naturaleza de SO. Eso es aún más difícil cuando tu inglés nativo no es inglés (mi caso). Solo tienes que acostumbrarte :-). Recuerdo una discusión en meta http://meta.stackexchange.com/questions/73/is-the-fastest-gun-in-the-west-solved/93#93 para evitar ser tan "desesperado" al publicar algo rápido . – GmonC

+0

¡Acabo de probar ese código en Windows 7 y FUNCIONA! eso fue una sorpresa. – Reallyethical

+0

@GmonC su derecho Debería calmarme, pero para ser sincero, me estoy acostumbrando a la velocidad de este sitio. Parece casi inútil publicar, ya que otros tienen la misma idea que yo. – Reallyethical

1

Aquí parte del código que detecta cuando portátil está funcionando con baterías (si no se dispara un evento):

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; 
Cuestiones relacionadas