Как обнаружить, что мое приложение бездействует в 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!");
}
}