2009-03-23 2 views
8

Windows CE에서 실행되는 .NET Compact Framework 3.5를 대상으로 C#으로 작성된 응용 프로그램이 있습니다. 때때로 UI 스레드에서 1 초 정도의 작업이 수행되고 있습니다. 현재 Cursor.Current 속성을 설정하여 응용 프로그램이 사용 중임을 나타내지 만 열망 사용자의 마우스 이벤트가 대기열에 들어가는 것을 방지하지 못합니다. 이로 인해 의도하지 않은 클릭이 발생할 수 있습니다.대기중인 마우스 이벤트 무시

.NET Compact Framework 플랫폼에서 대기중인 마우스 메시지를 무시하는 가장 좋은 방법은 무엇입니까? 안타깝게도 코드는 UI 스레드에서 실행되어야합니다.

답변

8

POS 응용 프로그램에서 사용자가 다른 클릭으로 몰래 들어올 수 있다는 것을 발견 했으므로 컨트롤을 사용하지 않도록 설정해도 도움이되지 않습니다. 특히 보정하지 않은 터치 스크린을 사용할 때 특히 그렇습니다.

현재 생성 된 문제 중 하나는 인보이스를 생성 할 때 현재 인보이스를 삭제하기 전에 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

나는 최선의 해결책은 사건을 방지하는 것이라고 생각한다. 긴 작업이 끝나면 모든 컨트롤을 비활성화하고 다시 활성화하여이 작업을 수행 할 수 있습니다.