我今天遇到这个问题,我看到了这个解决方案:
How to detect my application is idle in c#?
我试过了,但我的表单中包含了userControls和其他元素,而mouseover或keydown事件只在这些元素的边缘触发。
有更好的方法吗?
答案 0 :(得分:2)
使用计时器和鼠标事件将解决方案合并在一起是不必要的。只需处理Application.Idle事件。
Application.Idle += Application_Idle;
private void Application_Idle(object sender, EventArgs e)
{
// The application is now idle.
}
答案 1 :(得分:1)
如果您想要一种更加动态的方法,您可以订阅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!");
}
}