【问题标题】:System.Timers.Timer problem with starting after another key is releasedSystem.Timers.Timer 在另一个键被释放后启动问题
【发布时间】:2010-11-28 19:20:29
【问题描述】:

我有一个 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.

【问题讨论】:

  • 在 WinForms 应用程序中,您应该使用 System.Windows.Forms.Timer,而不是 System.Timers.Timer。它是如何弄乱你的动画的?
  • 我无法使用它,因为它会干扰我的动画。我已经尝试过了,但后来 stackoverflow 的人告诉我改用 Timers.Timer。至少我的动画现在工作正常,我唯一的问题似乎就是我上面说的那个。
  • 它是如何弄乱你的动画的?
  • 有趣的是,我已经放入了 System.Windows.Forms.Timer,它的工作原理与 System.Timers.Timer 完全相同。这意味着动画有效,但出现了与我上面描述的完全相同的问题。

标签: c# forms timer keyevent


【解决方案1】:

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

您可以忘记键盘事件并使用单个心跳计时器,检查按下了哪些键,然后对其进行操作。好像WinForms没有GetKeySate之类的东西,但你可以P/Invoke the win32函数。

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

【讨论】:

    【解决方案2】:

    如果您还没有这样做,请尝试这样做

    FormName.KeyPreview = true;

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

    【讨论】:

    • 我已经尝试过了。基本上,程序没有发现我按下了箭头键,所以我尝试覆盖我在互联网上找到的一些方法,据说可以让我找出是否按下了箭头键,但它仍然没有工作。
    • 为什么你不使用 System.Windows.Forms.Timer.. 它也适用于你的动画.. 一定要知道什么时候停止它......
    • 我用过,效果完全一样。我没有看到程序的行为发生任何变化。
    猜你喜欢
    • 2011-09-06
    • 1970-01-01
    • 2019-01-11
    • 2019-07-12
    • 1970-01-01
    • 1970-01-01
    • 2022-12-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多