我今天遇到了这个问题,我看到了这个解决方案:
我试过了,但我的表单被 userControls 和其他元素覆盖,并且 mouseover 或 keydown 事件仅在这些元素的边缘触发。
有没有更好的办法?
我今天遇到了这个问题,我看到了这个解决方案:
我试过了,但我的表单被 userControls 和其他元素覆盖,并且 mouseover 或 keydown 事件仅在这些元素的边缘触发。
有没有更好的办法?
无需将解决方案与计时器和鼠标事件组合在一起。只需处理 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
然后按照原始解决方案中的描述使用 a 轮询属性。
private void timer1_Tick(object sender, EventArgs e)
{
if (LastInteraction.TotalSeconds > 90)
{
MessageBox.Show("Idle!", "Come Back! I need You!");
}
}