0

所以我想制作一个方法来读取按键事件,然后将击键记录到一个字符串中。这个想法是字符串包含前导“R”或“L”,后跟2个整数。但是,当我在 MoveBox 方法中显示“MoveDist”字符串变量时,它总是重复 3 次相同的按键,而不是在每次敲击后重新轮询键盘。例如,当我运行调试并输入“R”时,程序崩溃,因为输入字符串立即变为“rrr”。有人有解决方案吗?

void Form1_KeyPress(object sender, KeyPressEventArgs e)
{

    String input = "";

        if (e.KeyChar == 108)
        {
            input = "l";
        }
        else if (e.KeyChar == 114)
        {
            input = "r";
        }
        else if (e.KeyChar >= 48 && e.KeyChar <= 57)
        {
            int charPress = e.KeyChar - 48;
            input = input + charPress.ToString();
        }

    Form1_MoveBox(input);

}

void Form1_MoveBox(String newInput)
{
    String input = "";
    while (input.Length <= 3)
    {
        input = input + newInput;
    }
    String moveDist = input.Substring(1, 3);

    MessageBox.Show(moveDist);

    int distance = Int32.Parse(moveDist);

    if (input.Substring(0, 1) == "l")
    {
        int x = panel1.Location.X - distance;
        int y = panel1.Location.Y;
        panel1.Location = new Point(x, y);
        panel1.Visible = true;
    }
    else if (input.Substring(0, 1) == "r")
    {
        int x = panel1.Location.X + distance;
        int y = panel1.Location.Y;
        panel1.Location = new Point(x, y);
        panel1.Visible = true;
    }
4

2 回答 2

0

如果您按住按键,按键事件也会触发。因此,如果您按 r 键,它很可能会触发多次。最好为此使用 keydown 事件。当你按下 r 键时它只会触发一次,但如果你按住键则不会继续触发。

于 2014-11-03T08:21:13.820 回答
0

使用KeyUp而不是KeyPress因为通常,您应该KeyUp在应用程序中处理事件。在用户释放密钥之前,不应在 UI 中启动操作。

在这种情况下触发的事件顺序是

  1. KeyDown(一次)
  2. KeyPress(直到按键被按下并基于操作系统设置的键盘延迟和重复率)
  3. KeyUp(一次)

您可以通过将布尔值设置为 true in然后将其设置为 false on来防止KeyPress用户长时间持有密钥时多次触发,但好处是无论用户多长时间,它们都只会触发一次按住按键,您可以避免“rrrrrrrrrrrr”。KeyDownKeyUpKeyUpKeyDown

使用的另一个好处KeyUp是您有许多关于用户输入的附加信息,例如是否按下了 Alt、Ctrl 或 Shift,或者您可以使用它Control的事件和KeyCode属性,并与之进行比较Keys以避免e.KeyChar == 108在您的代码并使其更具可读性,例如e.KeyCode == Keys.R.

于 2014-11-03T08:26:26.923 回答