Как изменить настройки часового пояса с помощью Windows API - PullRequest
3 голосов
/ 06 марта 2012

Мне нужно изменить DST и часовой пояс через 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 в C ++?

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

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

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

Ответы [ 2 ]

2 голосов
/ 06 марта 2012

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

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

plus, отправьте WM_SETTINGCHANGE как широковещательное сообщение, чтобы уведомить «трей» (SNA) об изменении.

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

2 голосов
/ 06 марта 2012

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

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

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

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

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