2009-09-14 7 views
9

背景: 私はいくつかのフォームなどでアプリケーションを書いています。ユーザーはほとんどの機能を使用するためにログインする必要があり、これまではうまくいきました。しかし、今や、クライアントは、ある一定量の非アクティブ時間の後にユーザがログアウトするように要求しています。問題は、ユーザーは自分のアプリケーションではなく、コンピュータ上でアクティブにできることです。明らかにするには、彼がまだデスクトップとやりとりしていても、彼が自分のアプリケーションで活動していないときにユーザーをログアウトさせる必要があります。C#ユーザーが活動していなかった期間

まず、これはかなり簡単だと思いました。最後のアクションの時間を覚えておいて、タイマーで現在の時間と連続的に比較し、経過した時間が許容時間より長い場合はユーザーをログアウトします。しかし、私は私はすべてのOnChange、クリック時など、イベントに

Program.LastActionTime = DateTime.Now; 

のようなペースト状のものをコピーすることができもちろん

...最後のアクションの時間を見つけることはそう単純ではないかもしれないことを認識しています...しかし、これはアプリケーションのサイズのために大量の作業になるだけでなく、非常に悪い習慣であり、少なくとも1回は忘れてしまい、すべてのものが信頼できないと確信しています(そして壊れているように見えますが、このバグはほとんど再生できません!)

これは良い方法ですか?

答えて

0

MouseMoveイベントとKeyPressedイベントでイベントハンドラをフックし、そのイベント内でフォーカスを確認しますか?

0

一般的に、生のユーザー入力ではなくアプリケーションロジックからこの情報を派生させることをお勧めしますが、この情報を提供する柔軟なインフラストラクチャ(多分command patternを使用していない)がないと仮定します。

あなたのメインフォームにハンドラを登録することをお勧めします。クリックまたはキーイベントを受け取った場合(Form.KeyPreviewを有効にする)、ユーザはアクティブであり、非アクティブ時間をリセットできます。

0

すべてのウィンドウフォームが継承する基本クラスを作成できます。基本クラスでは、すべてのKeyPressまたはClickでタイムアウトをチェックしてリセットします。私は過去に使用した

6

一つのアプローチは、アプリケーションのフォームにMessageFilterを作成し、ユーザーのアクティビティを示す特定の種類のイベントをチェック:

public class UserActivityFilter : IMessageFilter 
{ 
     // Define WinAPI window message values (see pinvoke.net) 
     private int WM_LBUTTONDOWN = 0x0201; 
     private int WM_MBUTTONDOWN = 0x0207; 
     private int WM_RBUTTONDOWN = 0x0204; 
     private int WM_MOUSEWHEEL = 0x020A; 
     private int WM_MOUSEMOVE = 0x0200; 
     private int WM_KEYDOWN = 0x0100; 

     public bool PreFilterMessage(ref Message m) 
     { 
      if (m.Msg == WM_LBUTTONDOWN || m.Msg == WM_MBUTTONDOWN || m.Msg == WM_RBUTTONDOWN || m.Msg == WM_MOUSEWHEEL || m.Msg == WM_MOUSEMOVE || m.Msg == WM_KEYDOWN) 
      { 
       //User activity has occurred 
       // Reset a flag/timer etc. 
      } 
      return false; 
     } 
    } 

その後のmain()メソッドで呼び出しは()を実行する前に、形成:

Application.AddMessageFilter(new UserActivityFilter()); 

1つの警告を、複雑なメッセージフィルタを追加したり、アプリケーションの応答性を遅くすることができ、複数の別々のフィルタを追加します。

1

それぞれのイベントメッセージで、WndProcを更新し、Program.LastActionTimeを更新することができます。

関連する問題