我正在编写一个WPF应用程序,如果用户没有与该程序交互30秒,我想提出一个事件。也就是说,没有键盘或/和鼠标事件。
我想要这样做的原因是因为如果变量alertstate
设置为true,我想引起对屏幕的注意。
我正在考虑使用类似BackgroundWorker
的内容,但我真的不知道如何才能获得用户没有与该程序交互的时间。有人能指出我正确的方向吗?
我想这个问题基本上归结为检查用户是否与屏幕进行了互动。我该怎么做?
答案 0 :(得分:7)
您可以这样做的一种方法是使用GetLastInputInfo。此信息将为您提供自上次用户在鼠标/键盘上进行交互以来经过的时间(以刻度表示)
你可以在这里获得信息:
http://www.pinvoke.net/default.aspx/user32.GetLastInputInfo
所以有一个计时器,用于检查上次进行交互的时间。如果您需要准确性,您可以检查每个5秒,例如,或者您可以,当您看到空闲持续y秒(y <30)时,设置一次性计时器将检查空闲时间之后(30- y)秒。
答案 1 :(得分:3)
您需要记录用户上次移动鼠标或按键的时间,然后检查该时间是否大于阈值。
因此,您需要向应用程序添加鼠标移动,鼠标单击和键盘处理程序(这是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;
然后在tick事件处理程序中有这样的东西:
private void idleTimer_Tick(object sender, EventArgs e)
{
if (DateTime.Now > timeOfLastActivity.AddSeconds(30))
{
// Do your stuff
}
}
答案 2 :(得分:-1)
使用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();
}