Получение уведомления при изменении даты и времени в c # - PullRequest
4 голосов
/ 17 ноября 2008

Недавно я пытался создать приложение календаря, которое будет отображать пользователю текущий год-месяц-дату. Проблема в том, что если пользователь будет продолжать работать с моим приложением даже на следующий день, как я получу уведомление? Как мне изменить отображаемую дату? Я не хочу опрашивать текущую дату, чтобы обновить ее. Это возможно в C #.

Примечание. Я опробовал событие SystemEvent.TimeChanged , но оно работает только в том случае, если пользователь вручную изменяет время / дату с панели управления.

Ответы [ 5 ]

6 голосов
/ 04 ноября 2010
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;

}
6 голосов
/ 17 ноября 2008

@ Ответ OddThinking будет работать (вы можете установить таймер для интервала вместо сна). Другой способ - установить таймер с интервалом в 1 минуту и ​​просто проверить, изменилась ли системная дата. Поскольку вы выполняете какой-то легкий код раз в минуту, я сомневаюсь, что эти издержки будут заметны.

4 голосов
/ 17 ноября 2008

Можете ли вы просто определить количество секунд до полуночи, а затем поспать так долго?

1 голос
/ 17 ноября 2008

Попробуйте изучить события 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));
    }
}
0 голосов
/ 17 ноября 2008

Как насчет потока, который проверяет изменение даты. Поток может иметь некоторые события, на которые могут подписаться элементы управления, которым нужна эта информация.

...