首页  编辑  

设置系统时间

Tags: /超级猛料/Date.Time.时间和日期/   Date Created:

设置系统时间 change the system time?

{1.}

{

 For Windows 9X/ME/NT/2000/XP:

 The SetLocalTime function fails if the calling process does not have

 the SE_SYSTEMTIME_NAME privilege. This privilege is disabled by default.

 Use the AdjustTokenPrivileges function to enable this privilege.

}

function SetPCSystemTime(dDateTime: TDateTime): Boolean;

const

 SE_SYSTEMTIME_NAME = 'SeSystemtimePrivilege';

var

 hToken: THandle;

 ReturnLength: DWORD;

 tkp, PrevTokenPriv: TTokenPrivileges;

 luid: TLargeInteger;

 dSysTime: TSystemTime;

begin

 Result := False;

 if (Win32Platform = VER_PLATFORM_WIN32_NT) then

 begin

   if OpenProcessToken(GetCurrentProcess,

     TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then

   begin

     try

       if not LookupPrivilegeValue(nil, SE_SYSTEMTIME_NAME, luid) then Exit;

       tkp.PrivilegeCount := 1;

       tkp.Privileges[0].luid := luid;

       tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;

       if not AdjustTokenPrivileges(hToken, False, tkp, SizeOf(TTOKENPRIVILEGES),

         PrevTokenPriv, ReturnLength) then

         Exit;

       if (GetLastError <> ERROR_SUCCESS) then

       begin

         raise Exception.Create(SysErrorMessage(GetLastError));

         Exit;

       end;

     finally

       CloseHandle(hToken);

     end;

   end;

 end;

 DateTimeToSystemTime(dDateTime, dSysTime);

 Result := Windows.SetLocalTime(dSysTime);

end;

{************************************************************}

{2.}

procedure TForm1.Button1Click(Sender: TObject);

var

 SystemTime: TSystemTime;

 NewTime, NewDate: string;

begin

 NewTime := '13:58:00';

 NewDate := '02.02.2001'; // or '02/02/01'

 DateTimeToSystemTime(StrToDate(NewDate) + StrToTime(NewTime), SystemTime);

 SetLocalTime(SystemTime);

 // Tell windows, that the Time changed!

 PostMessage(HWND_BROADCAST, WM_TIMECHANGE, 0, 0); // *

end;

{

Windows 2000 and later: An application should not broadcast

the WM_TIMECHANGE message because the system will broadcast

this message when the application changes the system time.

}

{************************************************************}

{3.}

function SetSystemTime(DateTime: TDateTime): Boolean;

{ (c) by UNDO }

var

 tSetDati: TDateTime;

 vDatiBias: Variant;

 tTZI: TTimeZoneInformation;

 tST: TSystemTime;

begin

 GetTimeZoneInformation(tTZI);

 vDatiBias := tTZI.Bias / 1440;

 tSetDati := DateTime + vDatiBias;

 with tST do

 begin

   wYear := StrToInt(FormatDateTime('yyyy', tSetDati));

   wMonth := StrToInt(FormatDateTime('mm', tSetDati));

   wDay := StrToInt(FormatDateTime('dd', tSetDati));

   wHour := StrToInt(FormatDateTime('hh', tSetDati));

   wMinute := StrToInt(FormatDateTime('nn', tSetDati));

   wSecond := StrToInt(FormatDateTime('ss', tSetDati));

   wMilliseconds := 0;

 end;

 Result := Windows.SetSystemTime(tST);

end;

{************************************************************}