System.Timers.Timer проблема с запуском после выпуска другого ключа - PullRequest
1 голос
/ 28 ноября 2010

У меня есть программа WinForms, где у меня есть определенный анимированный объект, который перемещается, когда я нажимаю вверх, вниз, влево и вправо. Движение объекта анимируется внутри таймера, который вызывается каждые 30 мс. Таймер запускается при событии KeyDown и останавливается при событии KeyUp.

Итак, если я удержу, например, левую, а затем сразу после того, как отпущу левую клавишу и нажму еще одну, будет небольшая пауза (около полсекунды), прежде чем она начнет двигаться в этом направлении. Эта проблема не появляется, если я удерживаю влево, отпустите ее и немного подожду, и , затем нажмите вправо. В таком случае он сразу же двинется вправо. Это также не появляется, если я удерживаю влево, а затем начинаю удерживать вправо, пока я все еще держусь влево. В этом случае он сразу же начнет двигаться прямо. Проблема появляется только тогда, когда я отпускаю клавишу и сразу же нажимаю другую.

Событие KeyDown:

private void form_KeyDown(object sender, KeyEventArgs e)
    {
        k = 0;
        watch.Start();

        if (e.KeyCode == Keys.Left)
        {
            direction = MOVE_LEFT;
        }
        else if (e.KeyCode == Keys.Right)
        {
            direction = MOVE_RIGHT;
        }
        else if (e.KeyCode == Keys.Up)
        {
            direction = MOVE_UP;
        }
        else if (e.KeyCode == Keys.Down)
        {
            direction = MOVE_DOWN;
        }
        timerMove.Start();
    }

Событие KeyUp:

private void form_KeyUp(object sender, KeyEventArgs e)
    {
        timerMove.Stop();
    }

Событие таймера (анимация движения)

void charMovement(object sender, System.Timers.ElapsedEventArgs e)
    {
        if (direction == MOVE_LEFT)
        {
                timerMove.Interval = 30;
                CharSize(11, 15); //mainChar.Size = new System.Drawing.Size(11, 15);
                //code for movement

        }
        else if (direction == MOVE_RIGHT) //... etc. etc.

Ответы [ 2 ]

1 голос
/ 28 ноября 2010

Проблема не в таймерах, а в настройке повторной паузы на клавиатуре.Если вы нажмете и удержите клавишу, между первой и второй буквой будет пауза.Более длинная пауза, затем между следующими буквами.Это то, что вы видите.

Вы можете забыть о событиях на клавиатуре и использовать один таймер сердцебиения, проверить, какие клавиши нажаты, а затем воздействовать на него.Кажется, в WinForms нет ничего похожего на GetKeySate , но вы можете P / вызвать функцию win32 .

Или вы можете свернуть свою собственную версию GetKeyState и вспомнить, чтоключи - нажатия в KeyDown и сброс флага в KeyUp.Таймер перемещения продолжает работать, пока нажата хотя бы одна клавиша.

0 голосов
/ 28 ноября 2010

попробуйте сделать это, если вы еще этого не сделали

FormName.KeyPreview = true;

Кроме того, используйте только один метод ... не два .. тенденция состоит в том, что нажатие клавиши будет считываться дважды, так как есть взлеты и падения ... попробуйте использовать KeyPreview = true; затем используйте KeyPress вместо KeyDown и KeyUp

...