2

C#アプリでWindowsシステムの日付/時刻が変更されたときに通知を受け取りたいのですが。SystemEvents.TimeChangedイベントを見つけました。これについては、MSDNのドキュメントに次のように記載されています。

ユーザーがシステム時計の時刻を変更したときに発生します。

NTPによってクロックが変更された場合にも、このイベントは発生しますか?または、購読できる別のイベントはありますか?

実装の詳細:

timer.Elapsedイベントを特定の日時に発生させたい。私のコードは、タイマーに使用するために必要な間隔を計算します。システム時刻が変更された場合は、この計算を再評価して、新しい間隔を計算し、タイマーを更新する必要があります。

回答の要約

すべてのコメントをありがとう。今後の参考のために、それらを以下に要約します。

  • SystemEvents.TimeChangedは、ユーザーの変更時、およびシステムがNTPサーバーとの再同期を要​​求したときに発生します
  • Windowsサービスで実行している場合は、TimeChangedイベントを取得するためにメッセージポンプを処理する必要があります。これは、ディスパッチャを実行することで実現できます。
  • NTPサーバーは、個別のシステム日付変更を適用しません。計算されたクロックドリフトとローカルクロックと他のNTPサーバー間のオフセットを考慮して、NTPクロック調整が徐々に適用されます。
  • 私の実装では、タイマー間隔を定期的に評価して、システム時間の変更を考慮に入れる方が、間隔を1回設定して起動したままにするよりも、適切です。
4

1 に答える 1

4

はい、TimeChangedNTPサーバーを使用して時刻を最新の状態に保つようにWindowsを構成した場合、および誰かが手動で時刻を変更した場合に発生します。

ここでの1つの注意点は、UIが必要であるということです。(またはメッセージポンプを取得するための非表示ウィンドウを開始します)。つまり、WindowsサービスでTimeChangedイベントを取得することはできません。

于 2012-08-20T23:37:58.617 に答える