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

エラーの戻りコードを確認しましたか? リンクされたページから次を参照してください。

SE_TIME_ZONE_NAMEこの関数を成功させるには、アプリケーションに特権が必要です。この権限はデフォルトで無効になっています。AdjustTokenPrivileges関数を 使用して、 呼び出し前に特権を有効SetTimeZoneInformationにし、呼び出し後に特権を無効にし SetTimeZoneInformationます。詳細については、特別な特権での実行を参照してください。

さらに、WM_SETTINGCHANGE変更について「トレイ」(SNA) に通知するブロードキャスト メッセージとして送信します。

サンプル コードが特権を有効にしようとしているのはわかっていますが、エラー チェックは行われず、SetTimeZoneInformationとにかく呼び出しが行われます ...

于 2012-03-06T17:14:32.507 に答える
2

コードが必要な権限で実行されていて、別の理由でSetTimeZoneInformation()返されなかったと仮定すると、システムのタイムゾーンが変更されました。FALSE

ただし、通知領域の時計アプレットはその変更を認識していません。そもそも通知を忘れているためです。ドキュメントRemarksのセクションを引用します。

タイム ゾーンが変更されたことを Explorer に通知するには、 WM_SETTINGCHANGEメッセージを送信します。

したがって、アプリケーションがシステムのタイム ゾーンを変更するときは、 WM_SETTINGCHANGEメッセージをすべての最上位ウィンドウにブロードキャストする必要があります。何かのようなもの:

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