2009-03-23 6 views
8

Ich habe eine Anwendung geschrieben in C# Targeting .NET Compact Framework 3.5, die auf Windows CE ausgeführt wird. Von Zeit zu Zeit werden auf dem UI-Thread Vorgänge ausgeführt, die etwa eine Sekunde dauern. Ich setze derzeit die Eigenschaft Cursor.Current, um anzuzeigen, dass die Anwendung beschäftigt ist, aber dies verhindert nicht, dass Mausereignisse von eifrigen Benutzern in die Warteschlange eingereiht werden. Dies führt manchmal zu unbeabsichtigten Klicks.Ignorieren von in der Warteschlange eingereihten Mausereignissen

Wie können Warteschlangenmausnachrichten auf der .NET Compact Framework-Plattform am besten ignoriert werden? Leider muss der Code auf dem UI-Thread ausgeführt werden.

Antwort

8

Die Deaktivierung der Steuerelemente hilft Ihnen nicht, da ich in meiner POS-Anwendung festgestellt habe, dass die Benutzer in etwa 50 ms einen weiteren Klick einschieben können, insbesondere bei Verwendung eines nicht kalibrierten Touchscreens.

Eines der Probleme, die dies verursacht, ist, wenn Sie eine Rechnung erstellen, Sie können nicht doppelt klicken, um eine andere Rechnung zu erstellen, nur weil es eine 50ms Verzögerung vor dem Löschen der aktuellen Rechnung gibt.

In Fällen wie diesem, verwende ich ein ähnliches Muster wie folgt aus:

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 
    } 

Falls Sie den Bildschirm wieder zu aktivieren müssen, dies tun:

  this.Enabled = true; 

      ApprovalLockCount = 0; 

      DialogResult = DialogResult.None; 
+1

Der Vollständigkeit halber habe ich aufgelistete notwendige Definitionen für den p/Aufruf unter http://pastebin.ca/1369082 –

0

Ich glaube, dass die beste Lösung ist, die Ereignisse zu verhindern. Sie können dies tun, indem Sie alle Steuerelemente deaktivieren und erneut aktivieren, wenn der langwierige Vorgang abgeschlossen ist.