3

私は WPF アプリケーションをプログラミングしています。ユーザーが 30 秒間プログラムを操作しなかった場合にイベントを発生させたいと考えています。つまり、キーボードやマウスのイベントはありません。

これを行う理由は、変数が true に設定されている場合に画面に注意を向けたいからalertstateです。

のようなものを使用することを考えてBackgroundWorkerいますが、ユーザーがプログラムを操作していない時間をどのように取得できるか本当にわかりません。誰かが私を正しい方向に向けることができますか?

この質問は基本的に、ユーザーが画面を操作したかどうかを確認することに帰着すると思います。どうすればいいですか?

4

3 に答える 3

7

これを行う1つの方法は、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;

次に、tickイベントハンドラーに次のようなものがあります。

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 に答える