Visual Studio 2013窗体含按钮时KeyPress事件无法触发问题求助
问题原因
该异常的触发原因和窗体焦点路由逻辑直接相关:WinForm 默认的按键事件路由规则是当前获得焦点的控件优先接收按键事件,如果窗体上存在按钮这类可交互控件,默认会优先抢占焦点,按键事件会被控件消费,不会传递到窗体的KeyPress事件中,因此原有逻辑不会触发。
解决方案
方案1:开启窗体KeyPreview属性(实现成本最低)
该属性用于配置窗体优先接收所有按键事件,再将事件传递给获得焦点的控件,仅需要在构造函数中新增一行配置即可:
public START() { InitializeComponent(); // 开启窗体优先捕获按键的权限 this.KeyPreview = true; this.KeyPress += new KeyPressEventHandler(START_KeyPress); }
修改后原有START_KeyPress事件的处理逻辑不需要任何调整即可正常生效。
方案2:重写ProcessCmdKey方法(兼容性最高)
如果存在自定义控件会拦截按键事件,或者需要更高优先级的全局按键捕获能力,可以直接重写窗体的ProcessCmdKey方法,该方法不受焦点所在控件的影响,所有按键都会优先触发该方法:
public partial class START : Form { public START() { InitializeComponent(); // 无需再注册KeyPress事件 } // 重写ProcessCmdKey实现全局按键捕获 protected override bool ProcessCmdKey(ref Message msg, Keys keyData) { Meniu form2 = new Meniu(); form2.Show(); this.Hide(); // 返回true表示当前按键已被处理,不再向下传递给控件 return true; // 如果需要保留该按键对焦点控件的原有响应逻辑,可替换为 return base.ProcessCmdKey(ref msg, keyData); } }
内容的提问来源于stack exchange,提问作者Raul Bosoanca
相关产品推荐
相关产品推荐

