2016-12-02 14 views
1

ここで私がやろうとしていることがあります。ユーザーが正常にログインするとタイマーを有効または有効にするLogInフォームがあります。バックグラウンドでフォームを保持し、タイマーを30分に設定します。 30分の無活動がある場合、私はユーザーをLogInフォームに表示しないようにログオンします。アプリケーションに何らかのアクティビティがあるかどうかを判断する最も良い方法は何でしょうか。その場合、時間をDateTime.Now()にリセットします。私はこれらのイベントをそれぞれのフォームで使用することを考えていましたか?アプリケーションでのタイマーベースのアイドル時間トラッキング

MouseClick 
MouseDown 
KeyPress 
KeyDown 

vb.netにはこれを簡単にすることができるものはありますか?私が遭遇しました

GETUSERINPUT 

しかし、私はこの場合にはうまくいかないでしょうか?ユーザーは新しいデータを入力しているわけではないかもしれないが、レコードや何かを見ているだけかもしれないから?

EDIT:

私は私のアプリでタイマーを作成し、私はメッセージボックスを表示し、そんなに時間が経過したことを示すことができるように、時間と異なるを見つけようとしています。ボタンの上に

dim MyTime as date = DateTime.Now() 
Private Sub Button4_Click_1(sender As Object, e As EventArgs) Handles Button4.Click 

    MyTime = DateTime.Now() 
    Timer1.Interval = 1000 

End Sub 

Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick 

    If DateDiff("n", DateTime.Now(), MyTime) > 1 Then 

     MsgBox("TimesUP") 
    End If 

End Sub 

は私がMyTimeとDateTime.Now()との両方が動作しない「N」またはDateInterval.Minutes両方を表示しています...私はこれを行うをクリックします。なぜ ???!??!

+0

GETUSERINPUTや他の何かを試しましたか?これまでに試したことを投稿してください。 – apesa

+0

@plutonix - 私はそれが好きです。私はまた、DateDiff( "n"、DateTimeSet、Now())> 30のようなものを考えていました。datetimeset = datetime.Now() – BobSki

+0

私はこのことを再考して好奇心を持っています - ネットワーク管理者はシステムをログオフする/ 30分後にユーザーをスリープ状態にする?なぜこれはアプリの機能ですか? – Plutonix

答えて

1

何もデータを保存する必要はありません(前の質問によると)無駄な作業が最も簡単になると、デスクトップをロックするネットワークポリシーを考える必要があります。長いタイマーで

Partial Friend Class NativeMethods 
    <StructLayout(LayoutKind.Sequential)> 
    Structure LASTINPUTINFO 
     <MarshalAs(UnmanagedType.U4)> 
     Public cbSize As Integer 
     <MarshalAs(UnmanagedType.U4)> 
     Public dwTime As Integer 
    End Structure 

    ' Gets the time of the last user input in ms 
    <DllImport("user32.dll")> 
    Private Shared Function GetLastInputInfo(ByRef plii As LASTINPUTINFO) As Boolean 
    End Function 

    Friend Shared Function GetLastInputTimeElapsed() As Int32 
     Dim lastInputInf As New LASTINPUTINFO() 
     lastInputInf.cbSize = Marshal.SizeOf(lastInputInf) 
     lastInputInf.dwTime = 0 

     ' get time of last input, subtract current ticks 
     If GetLastInputInfo(lastInputInf) Then 
      ' conver to seconds 
      Return (Environment.TickCount - lastInputInf.dwTime) \ 1000 
     Else 
      Return 0 
     End If 
    End Function 
... 

それからちょうど経過秒(または分)チェック:

あなたはアイドル時間を追跡するWindowsのジョブをエミュレートしているので、あなたはアイドル時間を取得するためにAPIを使用することができます。

Private Sub Timer2_Tick(sender As Object, e As EventArgs) Handles Timer2.Tick 

    ' Gets the time of the last user input in ms 
    Dim elapsed = NativeMethods.GetLastInputTimeElapsed() 

    ' 45 sec TimeOut for testing 
    If elapsed > 45 Then 
     Label3.Text = "You're done!" 
    Else 
     Label3.Text = String.Format("Idle for: {0} secs", elapsed) 
    End If 
End Sub 

アニメーションGIFは十分な速さを示すために実行していけないが、入力は任意ののMouseMoveやキー入力などの形で検出されました。これはシステムの入力を検出することに注意してください - マウスの動きとあなたのアプリで最小化されたキーはカウントされます。これは、アプリが最小化され、自体がとなった場合には、それが消えてしまうのを見て驚いています。私が完全にAFKなら、それは別のことです。シンプルな形のために


ローカルタイマー

VB Detect Idle timeのための答えは非常に単純です:それはのMouseMoveやキー入力を見ている時はいつでもあなたの30分のタイマーを停止し、再起動します。それはしかし、コンテナコントロールの動きを検出しません。

Stopwatchを使用すると、あまりにも動作します:

' form/class level 
Private swLogout As Stopwatch 

' start it with the app: 
swLogout = New Stopwatch() 
swLogout.Start() 

あなたは、各キー入力とMouseMoveのためにそれを再起動する必要があります。最初の場合はtrueにKeyPreviewを設定し、それから:

Private Sub MainFrm_KeyPress(sender As Object, 
      e As KeyPressEventArgs) Handles MyBase.KeyPress 
    swLogout.Restart() 
End Sub 

MOUSEMOVEがより問題である、あなたはすべての主要なコンテナコントロールをフックする必要があります。

Private Sub MainFrm_MouseMove(sender As Object, 
      e As MouseEventArgs) Handles MyBase.MouseMove, 
        TabControl1.MouseMove, TabControl2.MouseMove, 
        ..., TabPage12.MouseMove 
    swLogout.Restart() 
End Sub 

その後かなり短いの経過時間を確認しますタイマー(おそらく3分のような):

Private Sub Timer2_Tick(sender As Object, e As EventArgs) Handles Timer2.Tick 
    Dim elapsed = swLogout.ElapsedMilliseconds \ 1000 

    ' demo == 3 secs 
    If elapsed > 3 Then 
     Label3.Text = "You're done!" 
     Timer2.Enabled = False 
    Else 
     Label3.Text = String.Format("Idle for: {0} secs", elapsed) 
    End If 
End Sub 
+0

編集の質問をしますか? – BobSki

+0

いいえ...気にすることはありませんが、おそらくそれについて考えることができます。 – Plutonix

+0

男!感謝します – BobSki

関連する問題