如何使用 windows api 更改时区设置
Posted
技术标签:
【中文标题】如何使用 windows api 更改时区设置【英文标题】:How to change time zone settings using windows api 【发布时间】:2012-03-24 04:48:33 【问题描述】:我需要在我的应用程序中通过 API 更改 DST 和时区。 我在以下链接末尾修改并复制了“SetTimeZoneInformation”用法示例并运行它: http://msdn.microsoft.com/en-us/library/windows/desktop/ms724944(v=vs.85).aspx
我假设我的时间设置应该反映在托盘或控制面板中的时间设置。但是什么也没发生。
以下几点也应该注意。
此代码修改“HKLM\SYSTEM\CurrentControlSet\Control\TimeZoneInformation”关键内容。 并且“HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones\my time zone”线程没有变化。但这就是我要找的!
有没有办法在 C++ 中使用 API 修改“我的时区”?
已添加(来自应在此处编辑的答案):
所以,实际上,我的目标是让我的应用程序在 Win7 下运行。现有功能使用 MANUAL DST 支持。因此,我需要以某种方式将此手动 DST 和 GMT 偏移设置与 Win7 同步。据我了解,SetTimeZoneInformation 函数只是尝试根据我的输入从现有的一组时区中查找时区。如果没有时区等于我的输入,Win7 使用默认时区,例如 UTC-12,并通知用户“当前时区无法识别”。
那么,我应该用什么方法来实现呢?
【问题讨论】:
【参考方案1】:假设您的代码以所需的权限运行,并且 SetTimeZoneInformation()
由于其他原因没有返回 FALSE
,那么它确实更改了系统的时区。
但是,通知区域中的时钟小程序不知道该更改,因为您一开始就忘了宣传它。引用documentation 的Remarks
部分:
要通知 Explorer 时区已更改,请发送
WM_SETTINGCHANGE
消息。
因此,当您的应用程序更改系统的时区时,您应该向所有***窗口广播WM_SETTINGCHANGE 消息。比如:
SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, NULL, NULL,
SMTO_NORMAL, aShortTimeoutInMilliseconds, NULL);
【讨论】:
【参考方案2】:您是否检查了返回代码是否有错误?从链接页面查看以下内容:
应用程序必须为此拥有
SE_TIME_ZONE_NAME
权限 功能成功。默认情况下禁用此权限。使用AdjustTokenPrivileges
函数调用前开启权限SetTimeZoneInformation
,然后在SetTimeZoneInformation
打电话。有关更多信息,请参阅运行 特殊特权。
另外,将WM_SETTINGCHANGE
作为广播消息发送以通知“托盘”(SNA)有关更改。
我知道示例代码尝试启用该权限,但它没有进行错误检查并继续调用SetTimeZoneInformation
...
【讨论】:
哇,你是对的。不知何故 LookupPrivilegeValue 让我收到错误 1313。ERROR_NO_SUCH_PRIVILEGE 怎么可能? 我发现XP下不需要启用权限,这就是我收到错误的原因。现在我已将权限注释掉并添加了WM_SETTINGCHANGE
发送代码。在SetTimeZoneInformation
行之后还添加了RegFlushKey(HKEY_LOCAL_MACHINE)
行。
为什么 HKLM\SYSTEM\CurrentControlSet\Control\TimeZoneInformation 中的 ActiveTimeBias
键没有改变?
好点,我没有看到你在原始问题中提到 XP。以上是关于如何使用 windows api 更改时区设置的主要内容,如果未能解决你的问题,请参考以下文章