我有一个用C#编写的针对.NET Compact Framework 3.5的应用程序,在Windows CE上运行.有时会在UI线程上执行持续一秒左右的操作.我当前设置Cursor.Current
属性以指示应用程序正忙,但这不会阻止急切用户排队的鼠标事件.这有时会导致意外点击.
在.NET Compact Framework平台上忽略排队鼠标消息的最佳方法是什么?遗憾的是,代码必须在UI线程上运行.
禁用控件对你没有帮助,正如我从我的POS应用程序中发现的那样,用户可以在大约50ms内潜入另一次点击,特别是在使用未校准的触摸屏时.
其中一个问题是,在生成发票时,您不能让重复的点击生成另一张发票,只是因为在清算当前发票之前有50ms的延迟.
在这种情况下,我使用类似于这样的模式:
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 }
如果您需要重新启用屏幕,请执行以下操作:
this.Enabled = true; ApprovalLockCount = 0; DialogResult = DialogResult.None;