2009-03-23 17 views
8

Ho un'applicazione scritta in C# che mira a .NET Compact Framework 3.5, in esecuzione su Windows CE. Di tanto in tanto, le operazioni della durata di un secondo circa vengono eseguite sul thread dell'interfaccia utente. Attualmente ho impostato la proprietà Cursor.Current per indicare che l'applicazione è occupata, ma ciò non impedisce agli utenti desiderosi di accodarsi. Questo a volte porta a clic involontari.Ignorare gli eventi del mouse in coda

Qual è il modo migliore per ignorare i messaggi del mouse in coda sulla piattaforma .NET Compact Framework? Purtroppo, il codice deve essere eseguito sul thread dell'interfaccia utente.

risposta

8

La disattivazione dei controlli non è di aiuto, come ho riscontrato dalla mia applicazione POS che gli utenti possono entrare di nascosto in un altro clic in circa 50 ms, soprattutto quando si utilizza uno schermo tattile non calibrato.

Uno dei problemi che crea è quando si produce una fattura, non si può avere un clic duplicato produrre un'altra fattura, solo perché c'è un ritardo di 50 ms prima di cancellare la fattura corrente.

In casi come questo, io uso un modello simile a questo:

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 
    } 

In caso di necessità di riattivare lo schermo, fare questo:

  this.Enabled = true; 

      ApprovalLockCount = 0; 

      DialogResult = DialogResult.None; 
+1

Per completezza, ho elencato la definizioni necessarie per il p/invoke a http://pastebin.ca/1369082 –

0

Credo che la soluzione migliore sia impedire che si verifichino eventi. Puoi farlo disabilitando tutti i controlli e riattivandoli, quando termina la lunga operazione.

Problemi correlati