2016-06-27 3 views
1

私はvb.netでアプリケーションを開発しています。ユーザーがメインフォームにいるのかどうかを知りたいのですが、何もしません。 ユーザーがアプリケーションを使用しているかどうかをチェックし、そうでない場合はログアウトする方法はありますか?アプリケーションをしばらく使用しないで閉じる

私はいくつかの検索をしましたが、私はこのコードを開発できれば結論は得られませんでした...だから私はこれをどのように解決すべきか考えていますか?

+0

一般的に、タイマーを使用します。毎回、タイマールーチンはあるフラグが立てられているかどうかをチェックします。もしそうなら、それはフラグをリセットし、タイマを再び開始する。それ以外の場合は、アプリケーションを終了します。 「何かをする」というコードの他の部分は、常にそのフラグを設定します。 *しかし、覚えておいてください、あなたはタイマーを2回走らせなければなりません。*(1分タイマーは今から2秒後に起きるかもしれません。)どのようにアレンジするかははっきりしています。 –

+1

変数を設定/追加するフォーム上のすべてのコントロール(コントロールがフォーカスを受け取ったとき)にハンドラを追加します。コントロールがフォーカスを獲得すると整数型の変数をプラス1に設定します。タイマーを使用して、何かが起こった場合、何も起こっていないアプリケーションがあればそれをチェックし、そうでなければその変数を0に戻します。私たちがあなたを助けるために私たちの助けを伸ばすことができないように私たちに何かを提供してください。私たちは具体的な問題をサポートしていますが、既に述べたようにいくつかのオプションがあります。 – Codexer

+0

はい、ありがとうございました。私は何も提供していませんでした。なぜなら私は検索して何も見つけられなかったからです。@ Zaggler –

答えて

-1

更新を監視し、必要に応じて実行を終了するタイマーでクラスを作成できます。

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イベントハンドラでリフレッシュコールを追加できます。これは、あなたがどこにいてもリフレッシュしていれば、多くの作業を節約できます。

+0

私はあなたの方法が好きです。しかし、私はそれを閉じるのではなく、アプリケーションを基本的にログアウトして別のフォームを表示するように変更できます。 –

+0

もちろんです。 IdleWatcherクラスでイベントを定義し、それをメインフォームで処理してログアウトすることができます。終了を呼び出す代わりにイベントを発生させます。 – djv

+0

しかし、IdleWatcherクラスでその変更を行うだけでいいですか? –

関連する問題