C#窗体无法接受Keydown事件
来源:互联网 发布:女生学编程好吗 编辑:程序博客网 时间:2024/06/05 00:44
问题一描述:当新建一个窗体时,添加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);
}
- C#窗体无法接受Keydown事件
- C#窗体无法接受Keydown事件
- C# WinForm窗体中有控件时keyDown事件问题处理方式
- C# WinForm窗体中有控件时keyDown事件问题处理方式
- 如何让Form窗体接收keydown事件?
- C#下的Webbrowser的KeyDown事件
- C# winform中keyDown事件用法
- MFC接受 keyDown消息
- keydown事件
- c# keydown
- 解决:无法引发Form.KeyUp或Form.KeyDown事件
- MFC接受 keyDown、char消息
- c#窗体事件
- C# 窗体事件备忘录,
- C#控件中的KeyDown、KeyPress 与 KeyUp事件浅谈
- C#控件中的KeyDown、KeyPress 与 KeyUp事件浅谈
- 转: C#控件中的KeyDown、KeyPress 与 KeyUp事件
- C#控件中的KeyDown、KeyPress 与 KeyUp事件浅谈
- 使用Ionic和AngularJS创建可以滑动的卡片
- 惊魂:马桶钻出凶狂大蛇 被捕获现场
- 类之间降低耦合javaScript
- Android学习笔记之Android组件之BroadcastReceiver(Android广播机制)
- mongo 索引优化
- C#窗体无法接受Keydown事件
- 用SQL语句添加删除修改字段
- android jni socket
- Java阻塞队列SynchronousQueue实现并发
- 协议: DTMF相关FAQ
- 我的android程序员面试经历(一)(北京)
- MPI(Message Passing Interface)
- poj 1915 Knight Moves
- android面试题总结加强版(二)