環境は、Delphi6.0, WindowsXPです。
システムの時刻を設定するにはどうすればよいのでしょうか?
EditHour
EditMinutes
EditSecond
それぞれの Text プロパティの値でシステムの時刻を設定したいのです。
試してませんが
http://www.swissdelphicenter.ch/en/showcode.php?id=90を参考に。
const
SE_SYSTEMTIME_NAME = 'SeSystemtimePrivilege';
var
hToken: THandle;
ReturnLength: DWORD;
tkp, PrevTokenPriv: TTokenPrivileges;
luid: TLargeInteger;
dSysTime: TSystemTime;
begin
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;
GetLocalTime(dSysTime);
dSysTime.wHour := strToint(EditHour.text);
dSysTime.wMinute := strToint(EditMinutes.text);
dSysTime.wMilliseconds := strToint(EditSecond.text);
Windows.SetLocalTime(dSysTime);
end;
わかりました。
どうやら、時間は指定時間から9を引かなければならないようです。
詳しい理由はわかりませんが、いくつかやってみてこうなってるようです。
確か9・・・って、グリニッジからの時差だったような。
それが、影響しているのかどうかわかりませんが
この方法で正しいのかどうか教えてください。
それとも、たまたまそうなっていたのでしょうか?
※サンプルはTEditをSpinEditに変えています。
SysTime.wYear := SpinEditYear.Value;
SysTime.wMonth := SpinEditMonth.Value;
SysTime.wDay := SpinEditDay.Value;
SysTime.wHour := SpinEditHour.Value - 9;
SysTime.wMinute := SpinEditMinute.Value;
SysTime.wSecond := SpinEditSecond.Value;
SysTime.wMilliseconds := 0;
SetSystemTime(SysTime);
> どうやら、時間は指定時間から9を引かなければならないようです。
上記URL の下のほうにある、GetTimeZoneInformationを使うと
分差を求めることが出来ます。それを足してください。
GetTimeZoneInformation(tTZI);
Hour:=ABS(tTZI.Bias) div 60;
Min:=ABS(tTZI.Bias) mod 60;
> SetSystemTime(SysTime);
SetLocalTime(dSysTime); にすれば
GetTimeZoneInformationは要らないと思います。
どうも、ありがとうございました。
解決しました!
ツイート | ![]() |