...change the system time?

Author: Thomas Stutz

Category: System

{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;

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


 

printed from
www.swissdelphicenter.ch
developers knowledge base