在c#中更改日期时间时收到通知

时间:2008-11-17 10:11:28

标签: c# events datetime systemevent

最近,我试图制作一个日历应用程序,向用户显示当前的年月日。问题是,如果用户要在第二天保持我的应用程序运行,我该如何得到通知?我该如何更改显示的日期?我不想轮询当前日期来更新它。这在c#中是否可行。

注意:我尝试了 SystemEvent.TimeChanged 事件,但仅当用户手动更改控制面板中的时间/日期时,它才有效。

5 个答案:

答案 0 :(得分:6)

@ OddThinking的答案将起作用(您可以为间隔而不是睡眠设置计时器)。另一种方法是设置一个间隔为1分钟的计时器,并检查系统日期是否已更改。由于您每分钟只执行一次轻量级代码,因此我怀疑开销会很明显。

答案 1 :(得分:6)

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;

}

答案 2 :(得分:4)

你可以简单地计算出午夜的秒数,然后再睡这么长时间吗?

答案 3 :(得分:1)

尝试查看监视WMI事件,您应该能够创建一个监视星期几更改的Wql事件查询(即ManagementEventWatcher等),然后设置事件到达时触发的事件处理程序。

using System;
using System.Management;

class Program
{
    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(); // Block this thread for test purposes only....
            w.Stop();
        }
    }

    static void TimeEventArrived(object sender, EventArrivedEventArgs e)
    {
        Console.WriteLine("This is your wake-up call");
        Console.WriteLine("{0}", new
        DateTime((long)(ulong)e.NewEvent.Properties["TIME_CREATED"].Value));
    }
}

答案 4 :(得分:0)

检查日期更改的线程如何?该线程可以包含一些需要此信息的控件可以订阅的事件。