忽略排队的鼠标事件

8
我有一个使用C#编写的应用程序,针对.NET Compact Framework 3.5,运行在Windows CE上。不时地,在UI线程上执行持续约一秒钟的操作。我目前将Cursor.Current属性设置为指示应用程序正在忙碌状态,但这并不能防止渴望交互的用户鼠标事件排队等待。这有时会导致意外的点击。
在.NET Compact Framework平台上忽略排队的鼠标消息的最佳方法是什么?遗憾的是,代码必须在UI线程上运行。
2个回答

8

禁用控件是没有帮助的,我从我的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;

1
为了完整起见,我已经在http://pastebin.ca/1369082列出了p/invoke所需的定义。 - Tormod Fjeldskår

0

我认为最好的解决方案是防止事件发生。您可以通过禁用所有控件并在长时间操作完成后重新启用它们来实现。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接