#freeze
[[ntpサーバに問い合わせ]]~
[[.NET]]
ネットに時間を問い合わせるのはいいけど、実際に時刻設定はどうするのって事よね。
これには複数の方法があるらしいわ。
* 時刻合わせ時の注意 [#n07963de]
Vista以降のWindowsだと、たぶん管理者(Administrator)じゃないとプログラムから時刻変更できないのよね。何もなくスルーされるかエラーになるはずよ。
そんな時は「 ''管理者で実行'' 」してね。
* 設定方法 [#w128143c]
** VB.NETを使う方法 [#f5194f9c]
実はVB.NETにAPIがあるらしいのね。でも個人的理由から今回は避けます。
** WindowsのDLLを使う方法 [#i8593cc0]
すごくWindows的な解法だけど、ちゃんと動くわ。~
なお、このコードのオリジナルは、 [[こっち>http://dobon.net/vb/dotnet/system/setlocaltime.html]] ね。今回は苦手分野なので全面的にお世話になったの。さすがの老舗よね。
using System.Runtime.InteropServices;
:
:
[StructLayout(LayoutKind.Sequential)]
public struct SystemTime
{
public ushort wYear;
public ushort wMonth;
public ushort wDayOfWeek;
public ushort wDay;
public ushort wHour;
public ushort wMinute;
public ushort wSecond;
public ushort wMiliseconds;
}
[DllImport("kernel32.dll")]
public static extern bool SetLocalTime(
ref SystemTime sysTime);
/// <summary>
/// 現在のシステム日時を設定する
/// </summary>
/// <param name="dt">設定する日時</param>
public static void SetNowDateTime(DateTime dt)
{
//システム日時に設定する日時を指定する
SystemTime sysTime = new SystemTime();
sysTime.wYear = (ushort) dt.Year;
sysTime.wMonth = (ushort) dt.Month;
sysTime.wDay = (ushort) dt.Day;
sysTime.wHour = (ushort) dt.Hour;
sysTime.wMinute = (ushort) dt.Minute;
sysTime.wSecond = (ushort) dt.Second;
sysTime.wMiliseconds = (ushort) dt.Millisecond;
//システム日時を設定する
SetLocalTime(ref sysTime);
}
* 本ページの記事の参考にしたサイト [#xfca0e8b]
:システム時計の日時を設定する(DOBON.NET)|http://dobon.net/vb/dotnet/system/setlocaltime.html
Formsの記事はバッチリだし、とにかく細かいTipsが素晴らしいの。さすが老舗よね。
反面、WPFの記事がないので百%頼りきりはまずい(※)と思うけど、それを差し置いてあまりある内容よ。先人の知恵に感謝しつつ見せていただきましょう。
(※:たとえばWPFのコンポーネント使いたい時、ここと一部の情報記事だけ見ていると、WPFにはwebBrowserがないとか勘違いする事があるみたいなの。上記サイトの情報は本当に素晴らしいんだけど、素晴らしいがゆえに気をつけましょうって事ね)