Windows 我无法使用SetDynamicTimeZoneInformation禁用夏令时
我使用SetDynamicTimeZoneInformation函数通过启用/禁用夏令时设置时区信息,在Vista/Win7或更高版本下,您可能会看到下面的代码片段。 现在,代码似乎工作正常,时区信息更新正确,但DynamicDaylightTimeDisabled标志有一个奇怪的问题。如果日光选项更改,则时间跳跃将更改一小时;但当我将DynamicDaylightTimeDisabled设置为true时,仍然选中了“从Vista/Win7时区设置自动调整夏令时时钟”对话框中的复选框 那么,我做错了什么?谢谢Windows 我无法使用SetDynamicTimeZoneInformation禁用夏令时,windows,winapi,timezone,dst,Windows,Winapi,Timezone,Dst,我使用SetDynamicTimeZoneInformation函数通过启用/禁用夏令时设置时区信息,在Vista/Win7或更高版本下,您可能会看到下面的代码片段。 现在,代码似乎工作正常,时区信息更新正确,但DynamicDaylightTimeDisabled标志有一个奇怪的问题。如果日光选项更改,则时间跳跃将更改一小时;但当我将DynamicDaylightTimeDisabled设置为true时,仍然选中了“从Vista/Win7时区设置自动调整夏令时时钟”对话框中的复选框 那么,我做
type
TRegTZI = record // a TZI registry value is 44 bytes in this order
Bias, // 4 bytes
StdBias, // 4 bytes
DltBias: integer; // 4 bytes
StdDate, // 16 bytes
DltDate: TSystemTime; // 16 bytes
end;
TTZIData = record
TZName: string;
Display, Dlt, Std: string;
RegTZI: TRegTZI;
end;
implementation
function TZIDtatToWinTDZI(ATZI: TTZIData; DDTDisabled: boolean): TIME_DYNAMIC_ZONE_INFORMATION;
var
WinTDZI: TIME_DYNAMIC_ZONE_INFORMATION;
begin
WinTDZI.Bias := ATZI.RegTZI.Bias;
WinTDZI.StandardBias := ATZI.RegTZI.StdBias;
WinTDZI.DaylightBias := ATZI.RegTZI.DltBias;
if not DDTDisabled then
begin
WinTDZI.StandardDate := ATZI.RegTZI.StdDate;
WinTDZI.DaylightDate := ATZI.RegTZI.DltDate;
end;
StringToWideChar(ATZI.Std, @WinTDZI.StandardName[0], 32);
StringToWideChar(ATZI.Dlt, @WinTDZI.DaylightName[0], 32);
StringToWideChar(ATZI.TZName, @WinTDZI.TimeZoneKeyName[0], 128);
WinTDZI.DynamicDaylightTimeDisabled := DDTDisabled;
Result := WinTDZI;
end;
function GetTZIDataByName(TZKeyName: string; var ATZI: TTZIData): boolean;
var
Reg: TRegistry;
BiRecSize: integer;
begin
Result := False;
Reg := TRegistry.Create;
try
Reg.RootKey := HKEY_LOCAL_MACHINE;
if Reg.OpenKey('Software\Microsoft\Windows NT\CurrentVersion\Time Zones\' + TZKeyName, False) then
begin
Result := True;
ATZI.TZName := TZKeyName;
if Reg.ValueExists('Display') then ATZI.Display := Reg.ReadString('Display');
if Reg.ValueExists('Dlt') then ATZI.Dlt := Reg.ReadString('Dlt');
if Reg.ValueExists('Std') then ATZI.Std := Reg.ReadString('Std');
if Reg.ValueExists('TZI') then BiRecSize := Reg.ReadBinaryData('TZI', ATZI.RegTZI, SizeOf(ATZI.RegTZI));
Reg.CloseKey;
end;
finally
Reg.free;
end;
end;
function Vista_SetTimeZone(TZKeyName: string; AutoAdjustEnabled: boolean;
var ErrStr: string): boolean;
var
ATZI: TTZIData;
WinTDZI: TIME_DYNAMIC_ZONE_INFORMATION;
begin
if GetTZIDataByName(TZKeyName, ATZI) then
begin
WinTDZI := TZIDtatToWinTDZI(ATZI, not AutoAdjustEnabled);
Result := SetDynamicTimeZoneInformation (WinTDZI) <> 0;
if Result then
SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, 0);
end;
end;
这实际上不是一个德尔福特有的问题。用windows和winapi标签来问这个问题会好得多,你应该阅读更多的读者。