System.Timers.Timer问题与另一个键被释放后启动

时间:2010-11-28 19:20:29

标签: c# forms timer keyevent

我有一个WinForms程序,当我按下Up,Down,Left和Right时,我有一个动画对象移动。对象的移动在计时器内动画,每隔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 个答案:

答案 0 :(得分:1)

问题不在于计时器,而在于键盘的重复暂停设置。如果按住某个键,则第一个和第二个字母之间会有一个暂停。然后在以下字母之间停留更长时间。这就是你所看到的。

您可以忘记键盘事件并使用单个心跳计时器,检查按下了哪些键然后对其进行操作。似乎WinForms没有类似GetKeySate的内容,但您可以P/Invoke the win32运行。

或者您可以滚动自己的GetKeyState版本并记住在KeyDown中按下哪些键并重置KeyUp中的标志。只要按下至少一个键,移动计时器就会一直运行。

答案 1 :(得分:0)

如果你还没有这样做,试试这个

FormName.KeyPreview = true;

另外,只使用一种方法..而不是两种..趋势是按键会被读取两次,因为有一个向上和向下...尝试使用KeyPreview = true; 然后使用KeyPress而不是KeyDown和KeyUp