转C#窗体无法接受Keydown事件
发布日期:2022-03-30 18:18:24 浏览次数:47 分类:博客文章

本文共 954 字,大约阅读时间需要 3 分钟。

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

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

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

问题二描述:将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);

       }

转载地址:https://www.cnblogs.com/COCC1/p/6062049.html 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:蓝牙核心规格
下一篇:DotNetBar grid筛选 按时间筛选

发表评论

最新留言

能坚持,总会有不一样的收获!
[***.219.124.196]2024年04月08日 16时45分47秒