whats new ¦  programming tips ¦  indy articles ¦  intraweb articles ¦  informations ¦  links ¦  interviews
 misc ¦  tutorials ¦  Add&Win Game

Tips (1541)

Database (90)
Files (137)
Forms (107)
Graphic (114)
IDE (21)
Indy (5)
Internet / LAN (130)
IntraWeb (0)
Math (76)
Misc (126)
Multimedia (45)
Objects/
ActiveX (51)

OpenTools API (3)
Printing (35)
Strings (83)
System (266)
VCL (242)

Top15

Tips sort by
component


Search Tip

Add new Tip

Add&Win Game

Advertising

52 Visitors Online


 
...change the system time?
Autor: Thomas Stutz
[ Print tip ]  

Tip Rating (18):  
     


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

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



 

Rate this tip:

poor
very good


Copyright © by SwissDelphiCenter.ch
All trademarks are the sole property of their respective owners