最近、現在の年月日をユーザーに表示するカレンダー アプリケーションを作成しようとしていました。問題は、ユーザーが私のアプリケーションを翌日も実行し続ける場合、どうすれば通知を受け取ることができるでしょうか?? 表示される日付を変更するにはどうすればよいですか? 現在の日付をポーリングして更新したくありません。これはC#で可能ですか?
注: SystemEvent.TimeChangedイベントを試してみましたが、ユーザーがコントロール パネルから時刻/日付を手動で変更した場合にのみ機能します。
最近、現在の年月日をユーザーに表示するカレンダー アプリケーションを作成しようとしていました。問題は、ユーザーが私のアプリケーションを翌日も実行し続ける場合、どうすれば通知を受け取ることができるでしょうか?? 表示される日付を変更するにはどうすればよいですか? 現在の日付をポーリングして更新したくありません。これはC#で可能ですか?
注: SystemEvent.TimeChangedイベントを試してみましたが、ユーザーがコントロール パネルから時刻/日付を手動で変更した場合にのみ機能します。
public void Main()
{
var T = new System.Timers.Timer();
T.Elapsed += CallBackFunction;
var D = (DateTime.Today.AddDays(1).Date - DateTime.Now);
T.Interval = D.TotalMilliseconds;
T.Start();
}
private void CallBackFunction(object sender, System.Timers.ElapsedEventArgs e)
{
(sender as System.Timers.Timer).Interval = (DateTime.Today.AddDays(1).Date - DateTime.Now).TotalMilliseconds;
}
@OddThinkingの答えは機能します(スリープする代わりに間隔のタイマーを設定できます)。もう1つの方法は、1分間隔でタイマーを設定し、システムの日付が変更されたかどうかを確認することです。軽量コードを1分に1回しか実行していないので、オーバーヘッドが目立つとは思えません。
真夜中までの秒数を計算して、その時間だけ眠ることができますか?
WMIイベントの監視を調べてみてください。曜日の変更(つまり、ManagementEventWatcherなど)を監視するWqlイベントクエリを作成し、イベントが到着したときに起動するイベントハンドラーを設定できるはずです。
システムを使用する;
System.Managementを使用します。
クラスプログラム
{{
public static void Main()
{{
WqlEventQuery q = new WqlEventQuery();
q.EventClassName = "__InstanceModificationEvent";
q.Condition = @ "TargetInstance ISA'Win32_LocalTime' AND TargetInstance.Hour = 22 AND TargetInstance.Minute = 7 AND TargetInstance.Second = 59";
Console.WriteLine(q.QueryString);
using(ManagementEventWatcher w = new ManagementEventWatcher(q))
{{
w.EventArrived + = new EventArrivedEventHandler(TimeEventArrived);
w.Start();
Console.ReadLine(); //テスト目的でのみこのスレッドをブロックします...。
w.Stop();
}
}
static void TimeEventArrived(オブジェクト送信者、EventArrivedEventArgs e)
{{
Console.WriteLine( "これはウェイクアップコールです");
Console.WriteLine( "{0}"、new
DateTime((long)(ulong)e.NewEvent.Properties ["TIME_CREATED"]。Value));
}
}
日付の変更をチェックするスレッドはどうですか。スレッドには、この情報を必要とするコントロールがサブスクライブできるいくつかのイベントを含めることができます。