在没有用户交互的30秒后提升事件

时间:2012-08-31 10:46:57

标签: c# wpf

我正在编写一个WPF应用程序,如果用户没有与该程序交互30秒,我想提出一个事件。也就是说,没有键盘或/和鼠标事件。

我想要这样做的原因是因为如果变量alertstate设置为true,我想引起对屏幕的注意。

我正在考虑使用类似BackgroundWorker的内容,但我真的不知道如何才能获得用户没有与该程序交互的时间。有人能指出我正确的方向吗?

我想这个问题基本上归结为检查用户是否与屏幕进行了互动。我该怎么做?

3 个答案:

答案 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.ThreadIdleDispatcherTimer来实现此目标。

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();
}