3

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

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

4

2 回答 2

2

假设您的代码以所需的权限运行并且由于其他原因SetTimeZoneInformation()没有返回,那么它确实更改了系统的时区。FALSE

但是,通知区域中的时钟小程序不知道该更改,因为您忘记首先宣传它。Quoth文档Remarks的部分:

要通知 Explorer 时区已更改,请发送 WM_SETTINGCHANGE消息。

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

SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, NULL, NULL,
    SMTO_NORMAL, aShortTimeoutInMilliseconds, NULL);
于 2012-03-06T17:13:33.723 回答
2

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

应用程序必须具有SE_TIME_ZONE_NAME此功能成功的特权。默认情况下禁用此权限。调用前使用该 AdjustTokenPrivileges功能开启权限,调用 SetTimeZoneInformation后关闭权限 SetTimeZoneInformation。有关详细信息,请参阅以特殊权限运行。

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

我知道示例代码尝试启用该权限,但它不进行错误检查并继续调用SetTimeZoneInformation......

于 2012-03-06T17:14:32.507 回答