C#-winform-无法接受Keydown事件

C#窗体无法接受Keydown事件

问题一描述:当新建一个窗体时,添加KeyDown事件后,会正常处理,但是当添加有控件时,比如Button,TextBox,不会触发窗体的KeyDown事件,也没有调用KeyDown事件的处理程序。

原因:由于窗体中添加了控件,于是焦点就在其中一个控件上,如果我们要处理的事件窗体和获取焦点的控件都同时拥有,系统就会将键盘的操作键值直接传递给这个获取焦点的控件。,就会出现上面这个问题。

解决方案:此时需要将窗体的 KeyPreview属性设置为true ,将系统传入的键值先传递给窗体,再传递给控件。MSDN关于KeyPreview的说明:如果窗体将接收所有键事件,则为 true;如果窗体上当前选定控件接收键事件,则为 false。默认为 false。更多详情请参见MSDN:

http://msdn.microsoft.com/zh-cn/library/system.windows.forms.form.keypreview(VS.80).aspx

问题二描述:将keyPreview值设置成true后按功能键和数字键都没有问题,但是按方向键任然没有触发KeyDown事件。

原因:方向键是作为系统键来处理的,默认方向键的作用是移动焦点,系统处理完了就不会将键盘的键值传递个窗体或获取焦点的控件,也不会触发窗体的KeyDown事件。 在没有控件的时候没有其他的控件可以移动焦点,系统不处理,这才会将键值传递给窗体,触发KeyDown事件

解决方案:覆盖默认的系统键处理方式,遇到方向键,则直接返回,系统不处理,这样键值就会被传递到窗体,触发KeyDown事件。

覆盖默认的系统键处理方式的代码:       

protected override bool ProcessDialogKey(Keys keyData){
    switch (keyData){
        case Keys.Tab: label1.Text ="1";
			break;
		case Keys.Left: label1.Text ="2";
			break;
		case Keys.Right: label1.Text ="3";
			break;
		}
		if (keyData == Keys.Up || keyData == Keys.Down ||
			keyData == Keys.Left || keyData== Keys.Right)
			return false;
		else
	returnbase.ProcessDialogKey(keyData);
}

转自:http://blog.csdn.net/genganpeng/article/details/8649191

发布了17 篇原创文章 · 获赞 223 · 访问量 27万+

猜你喜欢

转载自blog.csdn.net/cxu123321/article/details/100167608
今日推荐