何もデータを保存する必要はありません(前の質問によると)無駄な作業が最も簡単になると、デスクトップをロックするネットワークポリシーを考える必要があります。長いタイマーで
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
GETUSERINPUTや他の何かを試しましたか?これまでに試したことを投稿してください。 – apesa
@plutonix - 私はそれが好きです。私はまた、DateDiff( "n"、DateTimeSet、Now())> 30のようなものを考えていました。datetimeset = datetime.Now() – BobSki
私はこのことを再考して好奇心を持っています - ネットワーク管理者はシステムをログオフする/ 30分後にユーザーをスリープ状態にする?なぜこれはアプリの機能ですか? – Plutonix