2009-03-23 23 views
8

Windows CE上で動作する.NET Compact Framework 3.5をターゲットとするC#で書かれたアプリケーションがあります。時々、UIスレッド上で1秒間以上の操作が実行されています。私は現在、アプリケーションがビジー状態であることを示すためにCursor.Currentプロパティを設定しましたが、熱心なユーザーからのマウスイベントがキューに入れられるのを防ぎません。これにより、意図しないクリックが発生することがあります。キューに入れられたマウスイベントを無視します。

.NET Compact Frameworkプラットフォームでキューに入れられたマウスメッセージを無視する最も良い方法は何ですか?悲しいことに、コードはUIスレッドで実行する必要があります。

答えて

8

私のPOSアプリケーションからは、特に校正されていないタッチスクリーンを使用している場合、約50msでユーザーが別のクリックで覗き見ることができるので、コントロールを無効にすることは役に立ちません。

現在発生している問題の1つは、請求書を作成するときに、現在の請求書を消去するまでに50msの遅延があるため、重複したクリックで別の請求書を作成することはできません。このような場合には

、私はこれに類似したパターンを使用します。

public static void ClearMouseClickQueue() 
    { 
     Message message; 
     while (PeekMessage(out message,IntPtr.Zero, (uint) MessageCodes.WM_MOUSEFIRST,(uint) MessageCodes.WM_MOUSELAST,1) != 0) 
     {  
     } 
    } 

    private object approvalLockObject = new object(); 

    private void btnApproveTransaction_Click(object sender, EventArgs e) 
    { 
     ApproveTransactionAndLockForm(); 
    } 

    private void ApproveTransactionAndLockForm() 
    { 
     lock (approvalLockObject) 
     { 
      if (ApprovalLockCount == 0) 
      { 
       ApprovalLockCount++; 
       ApproveTransaction(); 
      } 
      else 
      { 
       CloseAndRetry(); 
      } 
     } 
    } 

    private void ApproveTransaction() 
    { 
     ClearMouseClickQueue(); 

     this.Enabled = false; 

     Logger.LogInfo("Before approve transaction"); 

     MouseHelper.SetCursorToWaitCursor(); 

     ... validate invoice and print 
    } 

場合は、画面を再度有効にする必要があり、次の操作を行います。

  this.Enabled = true; 

      ApprovalLockCount = 0; 

      DialogResult = DialogResult.None; 
+1

完全性のために、私がリストアップしましたhttp://pastebin.ca/1369082のp/invokeに必要な定義 –

0

私は最良の解決策は、イベントが発生しないようにすることだと思います。長い操作が終わったら、すべてのコントロールを無効にして再度有効にすることでこれを行うことができます。

関連する問題