如何使用Windows API更改时区设置

时间:2012-03-06 16:56:46

标签: c++ time dst zone

我需要在我的应用程序中通过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,并通知用户“当前时区未被识别”。

那么,我应该用什么方法来实现呢?

2 个答案:

答案 0 :(得分:2)

假设您的代码以所需的权限运行,而SetTimeZoneInformation()由于其他原因未返回FALSE,则确实会更改系统的时区。

但是,通知区域中的时钟小程序不知道该更改,因为您忘记了首先做广告。请documentationRemarks部分:

  

要通知资源管理器时区已更改,请发送   WM_SETTINGCHANGE消息。

因此,当应用程序更改系统的时区时,您应该向所有顶级窗口广播WM_SETTINGCHANGE消息。类似的东西:

SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, NULL, NULL,
    SMTO_NORMAL, aShortTimeoutInMilliseconds, NULL);

答案 1 :(得分:2)

您是否检查了错误的返回代码?请参阅链接页面中的以下内容:

  

应用程序必须具有SE_TIME_ZONE_NAME权限   成功的功能。默认情况下禁用此权限。使用   AdjustTokenPrivileges函数在调用之前启用该特权   SetTimeZoneInformation,然后在之后禁用该权限   SetTimeZoneInformation致电。有关更多信息,请参阅运行   特权。

加上,发送WM_SETTINGCHANGE作为广播消息,通知“托盘”(SNA)有关更改。

我知道示例代码尝试启用该权限,但它没有进行错误检查,无论如何都要调用SetTimeZoneInformation ...