Получение уведомления при изменении даты и времени в C#
Недавно я пытался сделать приложение календаря, которое будет отображать текущий год-месяц-дату для пользователя. Проблема в том, что если пользователь будет продолжать работать с моим приложением даже на следующий день, как я получу уведомление? Как мне изменить отображаемую дату? Я не хочу опрашивать текущую дату, чтобы обновить ее. Это возможно в C#.
Примечание. Я опробовал событие SystemEvent.TimeChanged, но оно работает только в том случае, если пользователь вручную изменяет время / дату с панели управления.
5 ответов
Вы можете просто определить количество секунд до полуночи, а затем поспать так долго?
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 минуту и просто проверить, изменилась ли системная дата. Поскольку вы выполняете какой-то легкий код раз в минуту, я сомневаюсь, что эти издержки будут заметны.
Попробуйте изучить события WMI, вы сможете создать запрос события Wql, который отслеживает изменение дня недели (например, ManagementEventWatcher и т. Д.), А затем настроить обработчик события, который срабатывает при поступлении события.
используя Систему; использование 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"; ЕЫпе (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}", новый DateTime((длинный) (ULONG)e.NewEvent.Properties["time_created"] Значение.)); } }
Как насчет потока, который проверяет изменение даты. Поток может иметь некоторые события, на которые могут подписаться элементы управления, которым нужна эта информация.