「日付と時刻のプロパティ」/「インターネット時刻」タブ (タスクバーの時計をダブルクリックして開く) の「今すぐ更新」ボタンをクリックするのと同等の機能を実現する Windows API はありますか?
Windows によって時刻同期がトリガーされたとき、およびそれが成功または失敗したときを監視する方法はありますか?
「日付と時刻のプロパティ」/「インターネット時刻」タブ (タスクバーの時計をダブルクリックして開く) の「今すぐ更新」ボタンをクリックするのと同等の機能を実現する Windows API はありますか?
Windows によって時刻同期がトリガーされたとき、およびそれが成功または失敗したときを監視する方法はありますか?
タイムサービスによって公開されるAPIはありませんが、時間同期をトリガーするには、w32tm
コマンドラインツールを使用できます。
C / C ++では、次のようなことができます。
include <process.h>
...
system("w32tm /resync /nowait");
その他のオプションについては、w32tmのドキュメントをご覧ください。
これはうまくいくようです:
using System;
using System.Runtime.InteropServices;
namespace ClockResync
{
class Program
{
[DllImport("w32time.dll")]
public static extern uint W32TimeSyncNow([MarshalAs(UnmanagedType.LPWStr)]String computername, bool wait, uint flag);
static void Main(string[] args)
{
Console.WriteLine(W32TimeSyncNow("computername", true, 8).ToString());
Console.ReadLine();
}
}
}
文書化されていないため、可能なフラグが何であるかは正確にはわかりませんが、システムクロックでテストしたところ、8で問題なく機能しているようです。Windows 64 ビットを実行している場合は、64 ビット用にコンパイルしないと、アクセス違反の例外が発生します。
W32TimeQueryStatus
最後に成功した同期時間を取得できるはずです。もっと時間があるときにそれに取り組みます。