9

私は、ユーザーが 5 分間アイドル状態になってから何かを実行したかどうかを検出する方法を探しています。ユーザーが戻ってきた場合は、タイマーなどを停止します。

これは私が試したものです(ただし、これはform1が非アクティブ/クリックされていないかどうかのみを検出します):

Public Class Form1

Private Sub form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    'You should have already set the interval in the designer... 
    Timer1.Start()
End Sub

Private Sub form1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles Me.KeyPress
    Timer1.Stop()
    Timer1.Start()
End Sub


Private Sub form1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
    Timer1.Stop()
    Timer1.Start()
End Sub

Private Sub form1_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseClick
    Timer1.Stop()
    Timer1.Start()
End Sub

Private Sub Timer_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    MsgBox("Been idle for to long") 'I just have the program exiting, though you could have it do whatever you want.
End Sub

End Class
4

1 に答える 1

16

これは、メイン フォームに IMessageFilter インターフェイスを実装することで最も簡単に実行できます。入力メッセージがディスパッチされる前にスニッフィングできます。ユーザーがマウスまたはキーボードを操作しているのを確認したら、タイマーを再起動します。

メイン フォームにタイマーをドロップし、Interval プロパティをタイムアウトに設定します。2000 から始めて、動作することを確認してください。次に、メイン フォームのコードを次のようにします。

Public Class Form1
    Implements IMessageFilter

    Public Sub New()
        InitializeComponent()
        Application.AddMessageFilter(Me)
        Timer1.Enabled = True
    End Sub

    Public Function PreFilterMessage(ByRef m As Message) As Boolean Implements IMessageFilter.PreFilterMessage
        '' Retrigger timer on keyboard and mouse messages
        If (m.Msg >= &H100 And m.Msg <= &H109) Or (m.Msg >= &H200 And m.Msg <= &H20E) Then
            Timer1.Stop()
            Timer1.Start()
        End If
    End Function

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        Timer1.Stop()
        MessageBox.Show("Time is up!")
    End Sub
End Class

.NET コードで実装されていないモーダル ダイアログを表示する場合は、タイマーを一時的に無効にするコードを追加する必要がある場合があります。

于 2012-09-28T13:53:35.687 に答える