我正在使用WinAPI在Windows XP SP3框上设置时区。我正在从HKLM\Software\Microsoft\WindowsNT\Time Zones\<time zone name>
键读取时区信息,然后将时区设置为指定的时区。
我枚举“时区”键下的键,获取TZI
值并将其填充到TIME_ZONE_INFORMATION
结构中,以传递给SetTimeZoneInformation。一切似乎都在第一遍工作。时区更改,不返回错误。
我第二次执行此操作(同一用户,新 session ,在userinit之前登录时),调用成功,但是系统未反射(reflect)时区更改。文件上的时钟和时间戳都不会更新到新时区。当我导航到:HKLM\System\CurrentControlSet\Control\TimeZoneInformation
我的新时区信息存在。
设置时区时,发生了一些奇怪的事情:
TIME_ZONE_INFORMATION
结构中时,我注意到该结构的DaylightDate.wDay
和StandardDate.wDay
字段始终设置为0 SetTimeZoneInformation
之后立即调用GetTimeZoneInformation,但是调用失败并显示1300错误(并非所有引用的特权或组都分配给了调用者。)我还要确保发送
WM_BROADCAST
消息,以便Explorer知道发生了什么。认为这是将字节数组解析为
TIME_ZONE_INFORMATION
结构吗?还是我错过了其他重要的事情?编辑:
找到了说明发生这种情况的文档:here。特权是在Vista中引入的...感谢MSDN文档...
最佳答案
尝试使用LsaAddAccountRights代替LookupPrivilegeValue和AdjustTokenPrivileges设置SE_TIME_ZONE_NAME。另请参见this topic。