好的,我的上一个问题并没有真正清楚,所以我将其删除并制作了这个。 我正在制作游戏' snake'。 我想要的是,在我选择一个难度之后,表单上的keydown需要工作 (你选择一个难度,蛇被拉动并开始移动,为了让它移动到你喜欢的方向,你按箭头键) 在我添加困难之前,它完美地运作了。 在我选择难度并想玩游戏后,蛇不动,我的钥匙在程序中没有反应。
所以我的问题= keyDown在选择难度后无法正常工作。
private void btnNormal_Click(object sender, EventArgs e)
{
timer1.Interval = 250;
btnNormal.Visible = false;
btnEasy.Visible = false;
btnHard.Visible = false;
diffLabel.Visible = false;
timer1.Enabled = true;
down = false;
up = false;
right = true;
left = false;
}
private void btnHard_Click(object sender, EventArgs e)
{
timer1.Interval = 10;
btnNormal.Visible = false;
btnEasy.Visible = false;
btnHard.Visible = false;
diffLabel.Visible = false;
timer1.Enabled = true;
down = false;
up = false;
right = true;
left = false;
}
private void btnEasy_Click(object sender, EventArgs e)
{
timer1.Interval = 500;
btnNormal.Visible = false;
btnEasy.Visible = false;
btnHard.Visible = false;
diffLabel.Visible = false;
timer1.Enabled = true;
down = false;
up = false;
right = true;
left = false;
}
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyData == Keys.Down && up == false)
{
down = true;
right = false;
up = false;
left = false;
}
if (e.KeyData == Keys.Up && down == false)
{
down = false;
right = false;
up = true;
left = false;
}
if (e.KeyData == Keys.Right && left == false)
{
down = false;
right = true;
up = false;
left = false;
}
if (e.KeyData == Keys.Left && right == false)
{
down = false;
right = false;
up = false;
left = true;
}
}
答案 0 :(得分:1)
尝试将属性From.KeyPreview
设置为true
。
从上面的链接,msdn说到这个:
如果表单将收到所有关键事件,则为true;如果是当前的假 表单上的选定控件接收键事件。默认是 假的。
当此属性设置为true时,表单将接收所有KeyPress, KeyDown和KeyUp事件。表单的事件处理程序之后 完成按键操作后,按键分配到 有焦点的控制。例如,如果设置了KeyPreview属性 为true,当前选中的控件是一个TextBox,之后 keystroke由TextBox形式的事件处理程序处理 控件将收到按下的键。
简而言之,你的问题是焦点。您接收KeyDown事件的控件可能没有焦点。因此,无论接收事件的控件是否集中,我们都会强制执行表单以始终接收KeyDown事件。
答案 1 :(得分:1)
没有所有代码来测试它,很难通过判断......
但是,我的猜测是你在表单上添加了按钮。在这种情况下,如果按钮仍然具有焦点,则KeyDown事件不会发送到表单,而是发送到按钮。
我会将Form1_KeyDown方法转换为OnKeyDown基本方法的重写,并在构造函数中将PreviewKeys设置为true。
public MyForm()
{
InitializeComponent();
KeyPreview = true;
}
protected override void OnKeyDown(KeyEventArgs e)
{
// Insert key presses logic
base.OnKeyDown(e);
}