所以我想创建一个读取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;
}
答案 0 :(得分:0)
如果您按住键,也会触发按键事件。因此,如果您按下r键,它很可能会多次触发。最好将keydown事件用于此事件。按r键时只会触发一次,但如果按住键则不会继续触发。
答案 1 :(得分:0)
使用KeyUp
代替KeyPress
,因为通常情况下,您应该处理应用中的KeyUp
事件。在用户释放密钥之前,不应在UI中启动操作。
在这种情况下触发事件的顺序是
KeyPress
中将布尔值设置为true,然后在KeyDown
上将其设置为false,可以防止KeyUp
多次在用户长按该键时触发KeyUp
但关于KeyDown
和KeyUp
的好处是,无论用户按下按键多长时间,它们都会触发一次,你可以避免使用“rrrrrrrrrrr”。
使用Control
的另一个好处是,您有许多关于用户输入的其他信息,例如按下Alt,Ctrl或Shift或事件的KeyCode
和Keys
您可以使用该属性并将其与e.KeyChar == 108
进行比较,以避免在代码中使用某种e.KeyCode == Keys.R
并使其更具可读性,如{{1}}。