Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 忽略排队的鼠标事件_C#_.net_Events_Compact Framework_Windows Ce - Fatal编程技术网

C# 忽略排队的鼠标事件

C# 忽略排队的鼠标事件,c#,.net,events,compact-framework,windows-ce,C#,.net,Events,Compact Framework,Windows Ce,我有一个应用程序是用C#targeting.NET Compact Framework 3.5编写的,运行在Windows CE上。用户界面线程上不时会执行持续一秒左右的操作。我当前设置了Cursor.Current属性来指示应用程序正忙,但这并不能阻止急切的用户排队等待鼠标事件。这有时会导致意外的点击 在.NET Compact Framework平台上忽略排队的鼠标消息的最佳方法是什么?遗憾的是,代码必须在UI线程上运行。我认为最好的解决方案是防止事件发生。当冗长的操作结束时,您可以通过禁用

我有一个应用程序是用C#targeting.NET Compact Framework 3.5编写的,运行在Windows CE上。用户界面线程上不时会执行持续一秒左右的操作。我当前设置了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;

为了完整起见,我在下面列出了p/invoke的必要定义