繁体   English   中英

忽略排队的鼠标事件

[英]Ignoring queued mouse events

我有一个用 C# 编写的应用程序,针对 .NET Compact Framework 3.5,在 Windows CE 上运行。 有时,会在 UI 线程上执行持续一秒左右的操作。 我目前设置了Cursor.Current属性来指示应用程序正忙,但这并不能阻止急切的用户排队的鼠标事件。 这有时会导致意外点击。

在 .NET Compact Framework 平台上忽略排队鼠标消息的最佳方法是什么? 遗憾的是,代码必须在 UI 线程上运行。

禁用控件对您没有帮助,正如我从我的 POS 应用程序中发现的那样,用户可以在大约 50 毫秒内再次单击,尤其是在使用未校准的触摸屏时。

这造成的问题之一是在生成发票时,您不能重复点击生成另一张发票,因为在清除当前发票之前有 50 毫秒的延迟。

在这种情况下,我使用类似于以下的模式:

    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;

我认为最好的解决方案是防止事件发生。 当冗长的操作完成时,您可以通过禁用所有控件并重新启用它们来做到这一点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM