2013-09-24 33 views
0

Я нашел this post и создал класс, который использовал его для обнаружения неактивного времени, и он отлично работает. Я установил его на одну минуту, и через одну минуту я могу заставить его «делать что-то». То, что я пытаюсь сделать, - это делать только что-нибудь каждые «x» минуты неактивного времени; т. е. каждые 5 минут делают это, если что-то неактивно и не повторяется снова, пока не истечет время Х.Сбросить счетчик неактивного времени в C#

Теперь я могу настроить мой таймер на огонь каждые 5 минут, а не каждую секунду, но я бы хотел «перезагрузить» счет неактивного времени. Какие-либо предложения?

Это используется для использования DispatchTimer в C# и WPF.

+1

Так имея C# WPF объявлений в названии не является ни-ни? Как получилось так много других сообщений на этой самой доске с C# и WPF в их названиях? –

+0

Потому что они непослушные. Старайтесь избегать тегов в заголовках, если только это не приведет к тому, что заголовок не пройдет без него. –

+0

Если вы используете GetLastInputInfo (user32.dll) для вычисления неактивного времени, вы также можете использовать SendInput (user32.dll). Проверьте принятый ответ на странице http://stackoverflow.com/questions/4963135/wpf-inactivity-and-activity/4965166#4965166 (VB.NET) или http://homeofcox-cs.blogspot.gr/2008/07/ c-simulate-mouse-and-keyboard-events.html для кода C# –

ответ

1

Просто создайте переменную уровня класса, увеличьте ее на свой таймер и сбросьте ее, когда вы получите активность. Создать таймер, скажем, tmrDelay с шагом 10000 миллисекунд, и кнопка, btnActivity для сброса счетчика, и сделать это:

private int tickCount = 0; 
private const int tick_wait = 30; 

private void tmrDelay_Tick(object sender, EventArgs e) 
{ 
    tickCount++; 

    if (tickCount > tick_wait) 
    { 
     DoSomething(); 

     tickCount = 0; 
    } 
} 
private void btnActivity_Click(object sender, EventArgs e) 
{ 
    tickCount = 0; 
} 
+0

В основном, что я собирался сказать. Wayne, каждый раз, когда ваша форма wpf способна обнаруживать ввод пользователя (движение мыши, нажатие клавиши), вызовите метод, который снова устанавливает 'tickCount = 0;'. – jp2code

+0

Спасибо, был для меня моментом, простым решением, и это сработало –

0

Это звучит, как вы хотите что-то вроде следующего:

static DispatcherTimer dt = new DispatcherTimer(); 

static LastInput() 
{ 
    dt.Tick += dt_Tick; 
} 

static void dt_Tick(object sender, EventArgs e) 
{ 
    var timer = (DispatcherTimer)sender; 
    var timeSinceInput = TimeSpan.FromTicks(GetLastInputTime()); 

    if (timeSinceInput < TimeSpan.FromMinutes(5)) 
    { 
     timer.Interval = TimeSpan.FromMinutes(5) - timeSinceInput; 
    } 
    else 
    { 
     timer.Interval = TimeSpan.FromMinutes(5); 
     //Do stuff here 
    } 
} 

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

Если вы действительно хотите сбросить активное время, то вы будете на самом деле нужно, чтобы вызвать некоторую активность либо moving the mouse или sending a keypress