Mega Code Archive

 
Categories / Delphi / System
 

Change the system time

Title: 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; {************************************************************}