为什么不能触发Form1_keydown事件?

mon506 2016-01-19 08:12:57
本人是初学者,望各位指导!


namespace 俄罗斯方块
{
public partial class Form1 : Form
{
public static int cakeNO;
public static bool bl_nextCake = false;
Russia myRussia = new Russia();
Russia myRussia3 = new Russia();
bool isBegin = false; //判断是否开始
bool isPause = false; //判断是否暂停

public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
btn_start.Enabled = true;
btn_pause.Enabled = false;
this.KeyPreview = true;

}

private void btn_start_Click(object sender, EventArgs e)
{
myRussia.lb_linesClear = label1;
myRussia.lb_score = label2;
myRussia.myControl = panel1;
myRussia3.myControl = panel3;
myRussia.PlaceInitialization();
myRussia3.PlaceInitialization();
myRussia.firstPoint = new Point(150,30); //设置方块的起始位置
label1.Text = "0"; //显示行数,归0
label2.Text = "0"; //显示分数,归0
timer1.Interval = 500; //下移的速度
timer1.Enabled = false; //停止计时
Random rand = new Random(); //实例随机对象
cakeNO = rand.Next(1,8); //获取随机数
myRussia.CakeMode(cakeNO); //生成方块样式
myRussia.Protract(panel1); //绘制场景
NextCake(); //生成下一个方块
textBox1.Focus(); //获取焦点
isBegin = true;
btn_start.Enabled = false;
btn_pause.Enabled = true;
timer1.Enabled = true; //开始计时

}

/// <summary>
/// 生成下一个方块的样式
/// </summary>
public void NextCake()
{
Graphics p3 = panel3.CreateGraphics();
p3.FillRectangle(new SolidBrush(Color.Black),0,0,panel3.Width,panel3.Height);
Random rand = new Random();
cakeNO = rand.Next(1,8);
myRussia3.firstPoint = new Point(90,60);
myRussia3.CakeMode(cakeNO);
myRussia3.Protract(panel3);
}

private void Form1_KeyDown(object sender, KeyEventArgs e)
{
MessageBox.Show("ceshi");
if (!isBegin)
{
return;
}
if (isPause)
{
return;
}
if (e.KeyCode == Keys.Up) //变换方块的样式
{
myRussia.ConvertorMode(myRussia.convertor);
}
if (e.KeyCode == Keys.Down) //如果按下“↓”,加快速度,方块下移
{
timer1.Interval = 300;
myRussia.ConvertorMove(0);
}
if (e.KeyCode == Keys.Left) //按下“←”,方块左移
{
myRussia.ConvertorMove(1);
}
if (e.KeyCode == Keys.Right) //按下“→”,方块右移
{
myRussia.ConvertorMove(2);
}

}

private void timer1_Tick(object sender, EventArgs e)
{
myRussia.ConvertorMove(0); //方块下移
if(bl_nextCake)
{
NextCake(); //生成下一个方块
bl_nextCake = false;
timer1.Interval = 500; //速度恢复
}
textBox1.Focus(); //获取焦点
}

private void btn_pause_Click(object sender, EventArgs e)
{
if (isPause == false)
{
isPause = true;
timer1.Enabled = false;
btn_pause.Text = "继续";

}
else
{
isPause = false;
timer1.Enabled = true;
btn_pause.Text = "暂停";
}
}
...全文
593 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
静_心 2018-08-30
  • 打赏
  • 举报
回复
引用 4 楼 sp1234 的回复:
winform 窗体中,你可能一开始发现可以捕获方向键,然后过了一段时间增加了一些内容控件之后,突然又发现不能捕获了。然后当你恰好删除某个控件之后,乎然又能捕获到了。

这就是因为你的特定的内容控件拦截了消息。


如果是拦截了,怎么破?
ike333 2017-02-28
  • 打赏
  • 举报
回复
我也是一样的问题,检查KeyDown事件没有与frmMain_KeyDown()关联,关联后就好了。
lilei430381 2016-06-28
  • 打赏
  • 举报
回复
本人的设置窗体属性:Keypreview=true;搞定!希望给大家做参考!帮到大家!
  • 打赏
  • 举报
回复
winform 窗体中,你可能一开始发现可以捕获方向键,然后过了一段时间增加了一些内容控件之后,突然又发现不能捕获了。然后当你恰好删除某个控件之后,乎然又能捕获到了。 这就是因为你的特定的内容控件拦截了消息。
  • 打赏
  • 举报
回复
方向键跟你的焦点控件有关。有些焦点控件为了支持传统的窗体焦点移动行为(按光标键、Enter键、Tab键等等),会去禁止你的窗体KeyPreview的。 类似楼上的代码,但是你不用去破坏行为原来的窗体的行为。
protected override bool ProcessDialogKey(Keys keyData)
{
    if (keyData == Keys.Left || keyData == Keys.Right || keyData == Keys.Up || keyData == Keys.Down)
    {
        int x = 0;
    }
    return base.ProcessDialogKey(keyData);
}
在这里的 int x= 0 的地方处理你的操作就行了,不用修改原来的返回结果。
秋的红果实 2016-01-19
  • 打赏
  • 举报
回复
方向键默认不支持KeyDown事件,需要重写一个方法

protected override bool ProcessDialogKey(Keys keyData)
{
     if(keyData == Keys.Left || keyData == Keys.Right || keyData == Keys.Up || keyData == Keys.Down)
     {
         return false;
     }
     else
     {
         return base.ProcessDialogKey(keyData);
     }
}

然后,需要设置form属性Keypreview=true;
mon506 2016-01-19
  • 打赏
  • 举报
回复
为什么按键盘的其他键都触发该事件,但按 ↑↓←→ 键不触发呢??

111,095

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧