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;
fonte
2009-03-23 09:22:23
Per completezza, ho elencato la definizioni necessarie per il p/invoke a http://pastebin.ca/1369082 –