我需要在我的应用程序中通过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,并通知用户“当前时区未被识别”。
那么,我应该用什么方法来实现呢?
答案 0 :(得分:2)
假设您的代码以所需的权限运行,而SetTimeZoneInformation()
由于其他原因未返回FALSE
,则确实会更改系统的时区。
但是,通知区域中的时钟小程序不知道该更改,因为您忘记了首先做广告。请documentation的Remarks
部分:
要通知资源管理器时区已更改,请发送
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
...