Desactivar los controles no te ayudará, ya que he encontrado desde mi aplicación POS que los usuarios pueden colarse en otro clic en unos 50 ms, especialmente cuando se utiliza una pantalla táctil que no está calibrada.
Uno de los problemas que esto crea es cuando se produce una factura, no se puede hacer que un clic duplicado produzca otra factura, simplemente porque hay un retraso de 50 ms antes de borrar la factura actual.
En casos como este, yo uso un patrón similar a esto:
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
}
En caso de que necesite volver a activar la pantalla, haga lo siguiente:
this.Enabled = true;
ApprovalLockCount = 0;
DialogResult = DialogResult.None;
Para completar, he enumerado la definiciones necesarias para la p/invoke en http://pastebin.ca/1369082 –