当前位置:  开发笔记 > 编程语言 > 正文

忽略排队的鼠标事件

如何解决《忽略排队的鼠标事件》经验,为你挑选了1个好方法。

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

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



1> Miki Watts..:

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

推荐阅读
农大军乐团_697
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有