在Keypress活动中阅读多个键?

时间:2014-11-03 08:10:48

标签: c# .net winforms visual-studio eventhandler

所以我想创建一个读取keypress事件的方法,然后将键击记录到字符串中。这个想法是字符串包含一个领先的" R"或" L"后跟2个整数。但是,当我显示" MoveDist"在我的MoveBox方法中的字符串变量,它总是重复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;
    }

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

使用KeyUp代替KeyPress,因为通常情况下,您应该处理应用中的KeyUp事件。在用户释放密钥之前,不应在UI中启动操作。

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

  1. KeyDown(一次)
  2. KeyPress(按下该键并根据键盘的延迟和重复率的操作系统设置)
  3. KeyUp(一次)
  4. 通过在KeyPress中将布尔值设置为true,然后在KeyDown上将其设置为false,可以防止KeyUp多次在用户长按该键时触发KeyUp但关于KeyDownKeyUp的好处是,无论用户按下按键多长时间,它们都会触发一次,你可以避免使用“rrrrrrrrrrr”。

    使用Control的另一个好处是,您有许多关于用户输入的其他信息,例如按下Alt,Ctrl或Shift或事件的KeyCodeKeys您可以使用该属性并将其与e.KeyChar == 108进行比较,以避免在代码中使用某种e.KeyCode == Keys.R并使其更具可读性,如{{1}}。