C# KeyPress зарегистрирован дважды

У меня есть приложение Windows Forms с событием нажатия клавиши и события щелчка мышью.

Событие щелчка мыши переходит к событию нажатия клавиши в зависимости от того, где пользователь "щелкнул" (приложение работает на сенсорном ПК в режиме планшета). После каждого "нажатия / нажатия клавиш" я блокирую возможность нажатия с помощью таймера однократного срабатывания в течение 500 мс, чтобы пользователь не получал двойной щелчок и обычно он отлично работает.

Однако, если приложение "зависает" на секунду (перестает отвечать, а затем восстанавливается) или находится в оконном режиме, и я щелкаю вне приложения, если я возвращаюсь в приложение, то оно регистрирует каждый щелчок дважды. Даже если я нажимаю / нажимаю клавишу довольно быстро (чтобы она не превышала блокировку), я получаю результаты нажатия дважды.

Это проблема с потерей фокуса на приложении или может быть другая причина? Кто-нибудь знает какое-либо решение в такой ситуации?

Код нажатия клавиши:

private void Form1_KeyPress(object sender, KeyPressEventArgs e)
    {
        if (!actionLocked)
        {
                switch (page)
                {
                    case 0:
                        KeyPress_0_Page(e);
                        break;
                    default:
                        break;
                }
        }
    }

Код клавиши 0:

private void KeyPress_0_Page(KeyPressEventArgs e)
    {
        if (e.KeyChar == key_l4)
        {
          //do something
          page = 0;
          Load_page(page);
        }
    }

Загрузить страницу:

public void Load_Page(int page)
    {
            actionLocked = true;
            actionLock.Start();

        switch (page)
        {
            case 0:
                Page_0();
                break;
            default:
                break;
        }
    }

Настройки таймера:

        actionLock = new System.Timers.Timer();
        actionLock.Interval = 500; // 0,5s
        actionLock.Elapsed += new ElapsedEventHandler(actionLockTick);
        actionLock.Stop();

Таймер:

private void actionLockTick(object sender, EventArgs e)
    {
        actionLocked = false;
        actionLock.Stop();
    }

Mouseclick:

private void pb1_MouseClick(Object sender, MouseEventArgs e)
    {
        int maxH = 1080;
        int maxW = 1920;
        int x = e.X*maxW/pb1.Width;
        int y = e.Y*maxH/pb1.Height;
        PointF pt = new PointF(x, y);
        if(isInRect(cmlang1,pt)) //checking if click is in a rectangle on screen
        {
            SendKeys.Send("r");
            return;
        }
}

0 ответов

Другие вопросы по тегам