Как изменить настройки часового пояса с помощью Windows API

Мне нужно изменить летнее время и часовой пояс через API в моем приложении. Я изменил и скопировал пример использования «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». Но это то, что я ищу!

Есть ли способ изменить «мой часовой пояс» с помощью API на С++?

Добавлено (из ответа, который должен был быть отредактирован здесь):

Так что, собственно, моя цель - заставить мое приложение работать под Win7. Существующая функциональность использует поддержку MANUAL DST. Таким образом, мне нужно как-то синхронизировать эти ручные настройки смещения DST и GMT с настройками Win7. Как я понял, функция SetTimeZoneInformation просто пытается что-то вроде поиска часового пояса из существующего набора часовых поясов в соответствии с моим вводом. Если нет часового пояса, равного моему вводу, Win7 использует часовой пояс по умолчанию, например UTC-12, и уведомляет пользователя о том, что «текущий часовой пояс не распознан».

Итак, какой подход я должен использовать, чтобы понять это?


person Vadim    schedule 06.03.2012    source источник


Ответы (2)


Предполагая, что ваш код работает с требуемыми привилегиями и SetTimeZoneInformation() не возвращает FALSE по другой причине, тогда он изменил часовой пояс системы.

Однако апплет часов в области уведомлений не знает об этом изменении, потому что вы забыли объявить его в первую очередь. Цитата из раздела Remarks документации:

Чтобы сообщить Проводнику об изменении часового пояса, отправьте сообщение WM_SETTINGCHANGE.

Таким образом, вы должны передать сообщение WM_SETTINGCHANGE всем окна верхнего уровня, когда ваше приложение меняет часовой пояс системы. Что-то типа:

SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, NULL, NULL,
    SMTO_NORMAL, aShortTimeoutInMilliseconds, NULL);
person Frédéric Hamidi    schedule 06.03.2012

Вы проверяли коды возврата на наличие ошибок? См. следующее на связанной странице:

Приложение должно иметь привилегию SE_TIME_ZONE_NAME для успешного выполнения этой функции. Эта привилегия отключена по умолчанию. Используйте функцию AdjustTokenPrivileges, чтобы включить привилегию перед вызовом SetTimeZoneInformation, а затем отключить привилегию после вызова SetTimeZoneInformation. Дополнительные сведения см. в разделе Запуск с особыми привилегиями.

плюс отправьте WM_SETTINGCHANGE в качестве широковещательного сообщения, чтобы уведомить "лоток" (SNA) об изменении.

Я знаю, что пример кода пытается включить привилегию, но он не выполняет проверку ошибок и все равно вызывает SetTimeZoneInformation...

person 0xC0000022L    schedule 06.03.2012
comment
Вау, ты прав. Почему-то LookupPrivilegeValue выдает ошибку 1313. ERROR_NO_SUCH_PRIVILEGE Как такое может быть? - person Vadim; 07.03.2012
comment
Я понял, что нет необходимости включать привилегии под XP, поэтому я получаю ошибку. Прямо сейчас я закомментировал привилегии и добавил код отправки WM_SETTINGCHANGE. Также была добавлена ​​строка RegFlushKey(HKEY_LOCAL_MACHINE) после строки SetTimeZoneInformation. - person Vadim; 07.03.2012
comment
Почему ключ ActiveTimeBias в HKLM\SYSTEM\CurrentControlSet\Control\TimeZoneInformation не изменился? - person Vadim; 07.03.2012
comment
Хороший вопрос, я не видел, чтобы вы упоминали XP в исходном вопросе. - person 0xC0000022L; 07.03.2012