私はvb.netでアプリケーションを開発しています。ユーザーがメインフォームにいるのかどうかを知りたいのですが、何もしません。 ユーザーがアプリケーションを使用しているかどうかをチェックし、そうでない場合はログアウトする方法はありますか?アプリケーションをしばらく使用しないで閉じる
私はいくつかの検索をしましたが、私はこのコードを開発できれば結論は得られませんでした...だから私はこれをどのように解決すべきか考えていますか?
私はvb.netでアプリケーションを開発しています。ユーザーがメインフォームにいるのかどうかを知りたいのですが、何もしません。 ユーザーがアプリケーションを使用しているかどうかをチェックし、そうでない場合はログアウトする方法はありますか?アプリケーションをしばらく使用しないで閉じる
私はいくつかの検索をしましたが、私はこのコードを開発できれば結論は得られませんでした...だから私はこれをどのように解決すべきか考えていますか?
更新を監視し、必要に応じて実行を終了するタイマーでクラスを作成できます。
Public Class IdleWatcher
' TODO: Implements IDisposable
' TODO: and dispose _timer
Private _timer As System.Threading.Timer
Private _enabled As Boolean
Private _lastEvent As DateTime
Public Sub New()
_timer = New System.Threading.Timer(AddressOf watch)
_enabled = False
Timeout = 0
End Sub
Public Event Idle(sender As Object)
Public Property Timeout As Long
Public Property Enabled As Boolean
Get
Return _enabled
End Get
Set(value As Boolean)
If value Then
_lastEvent = DateTime.Now
_timer.Change(0, 1000)
Else
_timer.Change(System.Threading.Timeout.Infinite, System.Threading.Timeout.Infinite)
End If
End Set
End Property
Private Sub watch()
If DateTime.Now.Subtract(_lastEvent).TotalMilliseconds > Timeout Then
Enabled = false
' raise an event so the form can handle it and log out
RaiseEvent Idle(Me)
End If
End Sub
Public Sub Refresh()
_lastEvent = DateTime.Now
End Sub
End Class
このようなフォームアプリケーションで使用することができます。
Public Class Form1
Private WithEvents watcher As New IdleWatcher
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
watcher.Timeout = 5000 ' 5 second timeout
watcher.Enabled = True
End Sub
Private Sub Form1_MouseMove(sender As Object, e As MouseEventArgs) Handles Me.MouseMove
watcher.Refresh()
End Sub
Private Sub watcher_idle(sender As Object) Handles watcher.Idle
' If login.show is modal, then you don't need to call MainForm.Close()
' This will depend on your implementation
Login.Show()
MainForm.Close()
End Sub
End Class
これは、少なくともForm1のマウスの動きを監視します。インスタンスを複数のフォーム間で共有して、他のフォームからインスタンスをリフレッシュできるようにする場合は、クラスをシングルトンにすることができます。それは1つのための良い候補者です。
フォームのテキストボックスやボタンなどの他のコントロールのイベントハンドラから、リフレッシュを呼び出すこともできます。
さらに、すべてのコントロールをサブクラス化し、ベースクラスの関連するすべてのUIイベントハンドラでリフレッシュコールを追加できます。これは、あなたがどこにいてもリフレッシュしていれば、多くの作業を節約できます。
私はあなたの方法が好きです。しかし、私はそれを閉じるのではなく、アプリケーションを基本的にログアウトして別のフォームを表示するように変更できます。 –
もちろんです。 IdleWatcherクラスでイベントを定義し、それをメインフォームで処理してログアウトすることができます。終了を呼び出す代わりにイベントを発生させます。 – djv
しかし、IdleWatcherクラスでその変更を行うだけでいいですか? –
一般的に、タイマーを使用します。毎回、タイマールーチンはあるフラグが立てられているかどうかをチェックします。もしそうなら、それはフラグをリセットし、タイマを再び開始する。それ以外の場合は、アプリケーションを終了します。 「何かをする」というコードの他の部分は、常にそのフラグを設定します。 *しかし、覚えておいてください、あなたはタイマーを2回走らせなければなりません。*(1分タイマーは今から2秒後に起きるかもしれません。)どのようにアレンジするかははっきりしています。 –
変数を設定/追加するフォーム上のすべてのコントロール(コントロールがフォーカスを受け取ったとき)にハンドラを追加します。コントロールがフォーカスを獲得すると整数型の変数をプラス1に設定します。タイマーを使用して、何かが起こった場合、何も起こっていないアプリケーションがあればそれをチェックし、そうでなければその変数を0に戻します。私たちがあなたを助けるために私たちの助けを伸ばすことができないように私たちに何かを提供してください。私たちは具体的な問題をサポートしていますが、既に述べたようにいくつかのオプションがあります。 – Codexer
はい、ありがとうございました。私は何も提供していませんでした。なぜなら私は検索して何も見つけられなかったからです。@ Zaggler –