我知道这个问题已经被问过了 How to detect my application is idle in c# (form covered)?,等等 How to detect my application is idle in c#? 但是我找不到这些帖子中我的问题的最佳解决方案。
我有一个应用程序,如果已经过了一段时间需要注销。 我们当前正在使用getLastInput方法,它告诉上一次用户输入的滴答数。 我们从当前时间减去这个时间,并使用fromMiliseconds转换这个时间,我们检查从最后一个输入传递的时间是否大于我们的阈值,如果是,我们就会注销。
问题是getLastInput方法很快返回并且diff没有达到阈值,尽管事实上没有输入任何输入。
我认为通过Windows挂钩鼠标/键事件会很慢,因为每次输入时我们都需要重置计时器。
我很高兴听到你的想法。
答案 0 :(得分:0)
据我所知,没有办法规避对用户交互的检查,但实际上你可以稍微减轻它们的负担:
using System;
using System.Windows.Forms;
namespace MyApp
{
[SecurityPermission(SecurityAction.LinkDemand, Flags=SecurityPermissionFlag.UnmanagedCode)]
public class MyForm : Form, IMessageFilter
{
public MyForm()
{
// Your code...
InitializeComponent();
Application.AddMessageFilter(this);
}
public Boolean PreFilterMessage(ref Message m)
{
Boolean activated = (m.Msg == 0x010) || (m.Msg == 0x0A0) || (m.Msg == 0x100) || (m.Msg == 0x101) || (m.Msg == 0x200);
if (activated)
// Your timer logics...
return false;
}
}
}
答案 1 :(得分:0)
您可以使用System.Timers来解决您的问题。
System.Timers.Timer timer1 = new System.Timers.Timer();
timer1.Interval = 1000; //milliseconds after which you want to exit the application
timer1.Start();
timer1.Elapsed += TimerTick;
private void TimerTick(object sender, ElapsedEventArgs e)
{
if (Win32.GetIdleTime() > 1000)
{
Environment.exit();
}
}