Игнорирование событий от нажатия мыши с очередями

В цикле for задайте условие конечной точки вашего экрана, точно так же, как в графике, мы можем дать getmaxx () для автоматического определения координаты x максимальной длины вашего экрана, вот так вы можете добавить заголовочный файл

graphics.h ## заголовочный файл

А затем используйте getmaxx () для обнаружения x и затем getmaxy () для обнаружения y, который вы можете использовать, если он не работает, тогда прокомментируйте меня, я попробую его самостоятельно.

8
задан Tormod Fjeldskår 23 March 2009 в 08:16
поделиться

2 ответа

Отключение средств управления не поможет Вам, поскольку я нашел из своего приложения 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;
8
ответ дан 5 December 2019 в 20:20
поделиться

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

0
ответ дан 5 December 2019 в 20:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: