如何使用windowsapi更改时区设置

How to change time zone settings using windows api

本文关键字:时区 设置 何使用 windowsapi      更新时间:2023-10-16

我需要通过应用程序中的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\时区\我的时区"线程中没有任何更改。但这就是我要找的!

有没有任何方法可以在C++中使用API修改"我的时区"?

添加(来自本应在此处编辑的答案):

所以,实际上,我的目标是让我的应用程序在Win7下运行。现有功能使用MANUAL DST支持。因此,我需要以某种方式将手动DST和GMT偏移设置与Win7同步。据我所知,SetTimeZoneInformation函数只是根据我的输入,尝试从现有的一组时区中查找时区。如果没有与我的输入相等的时区,Win7会使用默认时区,例如UTC-12,并通知用户"当前时区无法识别"。

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

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

然而,通知区域中的时钟小程序并不知道这一变化,因为您一开始就忘记了做广告。引用文件的Remarks部分:

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

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

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

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

应用程序必须对此具有SE_TIME_ZONE_NAME权限成功的功能。默认情况下会禁用此权限。使用调用前启用特权的AdjustTokenPrivileges函数SetTimeZoneInformation,然后在SetTimeZoneInformation调用。有关详细信息,请参阅与一起跑步特殊特权。

此外,将WM_SETTINGCHANGE作为广播消息发送以通知"托盘"(SNA)有关该改变。

我知道示例代码试图启用特权,但它不会进行错误检查,并且无论如何都会调用SetTimeZoneInformation。。。