2009-10-28 14 views

cevap

15

Vista ve Windows 7'de durum değiştiğinde bildirim almak için RegisterPowerSettingNotification'u kullanabilirsiniz.

Windows 2000 ve üstü için, GetSystemPowerStatus'a bakın veya MSDN'ye gidin ve yaklaşık Power Management'u okuyun. laptop pille çalışırken algılamak kod İşte

(I :-(yazarak am süre biri hep nakleder)

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

Evet, bu doğanın ingilizcesi (benim durumum) ingilizcede değilken daha da zor.Çünkü buna alışmak zorundasın :-). Hızlı bir şey yazarken "çaresiz" olmaktan kaçınmak için meta http://meta.stackexchange.com/questions/73/is-the-fastest-gun-in-the-west-solved/93#93 adresindeki bir tartışmayı hatırlıyorum . – GmonC

+0

Sadece Windows 7'de bu kodu test etti ve ÇALIŞIYOR !! Bu bir sürpriz oldu. – Reallyethical

+0

@GmonC Haklıyım Sakinleşmeliyim, ama dürüst olmak gerekirse bu sitenin hızına alışmaktayım. Diğerleri benim yaptığım gibi aynı fikirde olduğu için, gönderme sırasında neredeyse anlamsız görünüyor. – Reallyethical

1

kısım (bazı olayı tetikler değilse):

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; 
İlgili konular