Как обнаружить, что мое приложение бездействует в C# (форма покрыта)?

У меня есть эта проблема сегодня, я видел это решение:

Как обнаружить, что мое приложение бездействует в C#?

Я попробовал это, но моя форма покрыта userControls и другими элементами, а события mouseover или keydown запускаются только на полях этих элементов.

Есть ли способ лучше?

2 ответа

Решение

Взламывать решение вместе с таймерами и событиями мыши не нужно. Просто обработайте событие Application.Idle.

Application.Idle += Application_Idle;

private void Application_Idle(object sender, EventArgs e)
{
    //    The application is now idle.
}

Если вы хотите более динамичный подход, вы можете подписаться на все события в вашем Form потому что в конечном итоге, если пользователь бездействует, никакие события не должны вызываться.

private void HookEvents()
{
    foreach (EventInfo e in GetType().GetEvents())
    {
        MethodInfo method = GetType().GetMethod("HandleEvent", BindingFlags.NonPublic | BindingFlags.Instance);
        Delegate provider = Delegate.CreateDelegate(e.EventHandlerType, this, method);
        e.AddEventHandler(this, provider);
    }
}

private void HandleEvent(object sender, EventArgs eventArgs)
{
    lastInteraction = DateTime.Now;
}

Вы можете объявить глобальную переменную private DateTime lastInteraction = DateTime.Now; и назначьте ему из обработчика событий. Затем можно написать простое свойство, чтобы определить, сколько секунд прошло с момента последнего взаимодействия с пользователем.

private TimeSpan LastInteraction
{
    get { return DateTime.Now - lastInteraction; }
}

А затем опросить собственность с Timer как описано в оригинальном решении.

private void timer1_Tick(object sender, EventArgs e)
{
   if (LastInteraction.TotalSeconds > 90)
   {
       MessageBox.Show("Idle!", "Come Back! I need You!");
   }
}
Другие вопросы по тегам