我正在编写一个 WPF 应用程序,如果用户在 30 秒内没有与程序交互,我想引发一个事件。也就是说,没有键盘或/和鼠标事件。
alertstate
我想这样做的原因是因为如果变量已设置为 true ,我想引起对屏幕的注意。
我正在考虑使用类似的东西,BackgroundWorker
但我真的不知道如何获得用户没有与程序交互的时间。有人可以指出我正确的方向吗?
我想这个问题基本上归结为检查用户是否与屏幕进行了交互。我该怎么做呢?
一种方法是使用 GetLastInputInfo。此信息将为您提供自上次用户在鼠标/键盘上交互以来经过的时间(以刻度为单位)。
你可以在这里获得信息:
http
://www.pinvoke.net/default.aspx/user32.GetLastInputInfo
所以有一个计时器来检查最后一次交互的时间。如果您需要准确性,您可以例如每 5 秒检查一次,或者当您看到空闲持续 y 秒(y<30)时,设置一个一次性计时器,将在 (30- y) 秒。
您需要记录用户最后一次移动鼠标或按键的时间,然后检查该时间是否大于您的阈值。
因此,您需要在应用程序中添加鼠标移动、鼠标单击和键盘处理程序(这是 Silverlight 代码,因此您可能需要更改命名空间等):
private void AttachEvents()
{
Application.Current.RootVisual.MouseMove += new MouseEventHandler(RootVisual_MouseMove);
Application.Current.RootVisual.KeyDown += new KeyEventHandler(RootVisual_KeyDown);
Application.Current.RootVisual.AddHandler(UIElement.MouseLeftButtonDownEvent, (MouseButtonEventHandler)RootVisual_MouseButtonDown, true);
Application.Current.RootVisual.AddHandler(UIElement.MouseRightButtonDownEvent, (MouseButtonEventHandler)RootVisual_MouseButtonDown, true);
}
然后在处理程序中有这样的代码用于鼠标移动:
private void RootVisual_MouseMove(object sender, MouseEventArgs e)
{
timeOfLastActivity = DateTime.Now;
}
和一个类似的KeyDown
事件处理程序。
您将不得不设置一个计时器:
idleTimer = new DispatcherTimer();
idleTimer.Interval = TimeSpan.FromSeconds(1);
idleTimer.Tick += new EventHandler(idleTimer_Tick);
// Initialise last activity time
timeOfLastActivity = DateTime.Now;
然后在滴答事件处理程序中有这样的事情:
private void idleTimer_Tick(object sender, EventArgs e)
{
if (DateTime.Now > timeOfLastActivity.AddSeconds(30))
{
// Do your stuff
}
}
使用ComponentDispatcher.ThreadIdle
和DispatcherTimer
来实现这一点。
DispatcherTimer timer;
public Window1()
{
InitializeComponent();
ComponentDispatcher.ThreadIdle += new EventHandler(ComponentDispatcher_ThreadIdle);
timer = new DispatcherTimer();
timer.Interval = TimeSpan.FromSeconds(30);
timer.Tick += new EventHandler(timer_Tick);
}
void timer_Tick(object sender, EventArgs e)
{
//Do your action here
timer.Stop();
}
void ComponentDispatcher_ThreadIdle(object sender, EventArgs e)
{
timer.Start();
}