3

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

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

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

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

4

3 回答 3

7

一种方法是使用 GetLastInputInfo。此信息将为您提供自上次用户在鼠标/键盘上交互以来经过的时间(以刻度为单位)。
你可以在这里获得信息: http
://www.pinvoke.net/default.aspx/user32.GetLastInputInfo 所以有一个计时器来检查最后一次交互的时间。如果您需要准确性,您可以例如每 5 秒检查一次,或者当您看到空闲持续 y 秒(y<30)时,设置一个一次性计时器,将在 (30- y) 秒。

于 2012-08-31T11:17:06.760 回答
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;

然后在滴答事件处理程序中有这样的事情:

private void idleTimer_Tick(object sender, EventArgs e)
{
    if (DateTime.Now > timeOfLastActivity.AddSeconds(30))
    {
        // Do your stuff
    }
}
于 2012-08-31T11:30:39.757 回答
-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();
}
于 2012-08-31T11:16:55.890 回答