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;
Der Vollständigkeit halber habe ich aufgelistete notwendige Definitionen für den p/Aufruf unter http://pastebin.ca/1369082 –