Игнорирование событий мыши в очереди - PullRequest
8 голосов
/ 23 марта 2009

У меня есть приложение, написанное на C # для .NET Compact Framework 3.5, работающее на Windows CE. Время от времени операции, продолжающиеся в течение секунды или около того, выполняются в потоке пользовательского интерфейса. В настоящее время я установил свойство Cursor.Current, чтобы указать, что приложение занято, но это не препятствует тому, чтобы события мыши встали в очередь. Это иногда приводит к непреднамеренным щелчкам.

Каков наилучший способ игнорировать сообщения мыши в очереди на платформе .NET Compact Framework? К сожалению, код должен выполняться в потоке пользовательского интерфейса.

Ответы [ 2 ]

8 голосов
/ 23 марта 2009

Отключение элементов управления не поможет вам, как я узнал из моего приложения для 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;
0 голосов
/ 23 марта 2009

Я считаю, что лучшим решением является предотвращение событий. Вы можете сделать это, отключив все элементы управления и снова включив их, когда закончится длительная операция.

...