Вот так можно узнать дату/время загрузки или завершения работы системы (т.е. когда компьютер был выключен или перезагружен последний раз):
Code: |
unit Unit1; {©Drkb v.3}
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TForm1 = class(TForm) Label1: TLabel; Label2: TLabel; procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end;
var Form1: TForm1;
implementation
uses Registry;
{$R *.dfm}
type
SYSTEM_TIME_OF_DAY_INFORMATION = record BootTime: LARGE_INTEGER; CurrentTime: LARGE_INTEGER; TimeZoneBias: LARGE_INTEGER; CurrentTimeZoneId: ULONG; end; PSYSTEM_TIME_OF_DAY_INFORMATION = ^SYSTEM_TIME_OF_DAY_INFORMATION;
NTSTATUS = DWORD;
const SystemTimeOfDayInformation =3;
function NtQuerySystemInformation(SystemInformationClass:byte; SystemInformation: Pointer; SystemInformationLength: ULONG; ReturnLength: PULONG): NTSTATUS; stdcall; external 'NTDLL.DLL';
function SysDateToStr(ST : TSystemTime) : string; const sDateFmt = 'dddd, d MMMM, yyyy'; begin SetLength(Result, 255); GetDateFormat(LOCALE_USER_DEFAULT, 0, @ST, sDateFmt, @result[1], 255); SetLength(Result, LStrLen(@result[1])); end;
function SysTimeToStr(ST : TSystemTime):string; const sTimeFmt = 'HH:mm:ss' ; begin SetLength(result,15); GetTimeFormat(LOCALE_USER_DEFAULT,0,@st,sTimeFmt,@result[1],15); SetLength(result, StrLen(@result[1])); end;
function GetFileTimeToSystemTime(ft:TFileTime):string; var st,lt:TSystemTime; tz:TTimezoneInformation; begin Result:=''; if not FileTimeToSystemTime(ft, st) then exit; GetTimeZoneInformation(tz); SystemTimeToTzSpecificLocalTime(@tz,st,lt); Result:=SysDateToStr(lt)+' at ' + SysTimeToStr(lt); end;
// дата/время последнего выключения (или перезагрузки) системы function GetLastSystemShutdown:string; var ft:TFileTime; reg:TRegistry; begin Result:=''; reg:=TRegistry.Create; try reg.RootKey:=HKEY_LOCAL_MACHINE; if (not reg.OpenKeyReadOnly('System\CurrentControlSet\Control\Windows')) then exit; if (reg.ReadBinaryData('ShutdownTime',ft,sizeof(ft))=0) then exit finally reg.Free end; Result:= GetFileTimeToSystemTime(ft) end;
// дата/время старта системы function NtGetBootDateTime:string; var sti : SYSTEM_TIME_OF_DAY_INFORMATION; status : NTSTATUS; ftSystemBoot: FILETIME; ST:TSystemTime; begin Result:=''; status:=NtQuerySystemInformation(SystemTimeOfDayInformation, @sti, sizeof(SYSTEM_TIME_OF_DAY_INFORMATION),nil); if (status<>NO_ERROR) then exit; ftSystemBoot := PFILETIME(@(sti.BootTime))^; if FileTimeToLocalFileTime(ftSystemBoot,ftSystemBoot) then if FileTimeToSystemTime(ftSystemBoot,ST) then Result:=SysDateToStr(ST)+' at '+SysTimeToStr(ST) end;
procedure TForm1.FormCreate(Sender: TObject); begin Label1.Caption:='System start: '+NtGetBootDateTime; label2.Caption:='Last system shutdown: '+GetLastSystemShutdown; end;
end. |
PS: работает только в NT и выше.
Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.
ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!