2012-03-06 111 views
2

我需要通過我的應用程序中的API更改DST和時區。 我修改通過以下鏈接的終結「SetTimeZoneInformation」使用的&複製示例並運行它: http://msdn.microsoft.com/en-us/library/windows/desktop/ms724944(v=vs.85).aspx如何使用windows api更改時區設置

我假設我的時間設置應體現在托盤或控制面板我的時間設置。但沒有任何反應。

以下的事情也應該注意。

此代碼修改「HKLM \ SYSTEM \ CurrentControlSet \ Control \ TimeZoneInformation」的關鍵內容。 並且「HKLM \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Time Zones \我的時區」線程中沒有更改。但這是我正在尋找的!

有什麼方法可以用C++中的API修改「我的時區」嗎?

增加(從本應在這裏被編輯答案):

所以,實際上,我的目標是讓我的應用程序的Win7下工作。現有功能使用MANUAL DST支持。因此,我需要以某種方式將此手動DST和GMT偏移設置與Win7同步。據我所知,SetTimeZoneInformation函數只是根據我的輸入嘗試類似於從現有時區集合中查找時區。如果沒有時區等於我的輸入,則Win7使用默認的時區,例如UTC-12,並通知用戶「當前時區未被識別」。

那麼,我應該用什麼方法來實現呢?

回答

1

假設您的代碼運行時具有所需的權限,SetTimeZoneInformation()由於其他原因未返回FALSE,則它確實更改了系統的時區。

但是,通知區域中的時鐘小程序並不知道有關更改,因爲您忘記了首先將其廣告。答曰documentationRemarks部分:

爲了通知資源管理器的時區已經改變,發送 WM_SETTINGCHANGE消息。

因此,當應用程序更改系統的時區時,您應該向所有頂級窗口廣播WM_SETTINGCHANGE消息。例如:

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

您是否檢查了錯誤的返回碼?請參閱從鏈接頁面如下:

應用中必須具備的SE_TIME_ZONE_NAME特權此 功能成功。該特權在默認情況下被禁用。使用 AdjustTokenPrivileges函數在調用 SetTimeZoneInformation之前啓用該特權,然後在調用之後禁用特權。有關更多信息,請參閱使用 特殊權限運行。

plus,發送WM_SETTINGCHANGE作爲廣播消息通知「托盤」(SNA)有關此更改。

我知道示例代碼嘗試啓用的特權,但它沒有錯誤檢查,去來回調用SetTimeZoneInformation反正...

+0

哇,你是對的。不知怎的,LookupPrivilegeValue讓我錯誤1313. ERROR_NO_SUCH_PRIVILEGE 它怎麼可能? – Vadim 2012-03-07 09:47:22

+0

我覺得沒有必要在XP下啓用權限,這就是爲什麼我得到錯誤。現在我已經評論了特權並添加了「WM_SETTINGCHANGE」發送代碼。同時在'SetTimeZoneInformation'行之後添加了'RegFlushKey(HKEY_LOCAL_MACHINE)'行。 – Vadim 2012-03-07 10:31:20

+0

爲什麼HKLM \ SYSTEM \ CurrentControlSet \ Control \ TimeZoneInformation中的ActiveTimeBias'鍵沒有改變? – Vadim 2012-03-07 10:41:24