C# 火形按键事件
我有一个C#winform,上面有一个按钮。C# 火形按键事件,c#,.net,winforms,events,keyevent,C#,.net,Winforms,Events,Keyevent,我有一个C#winform,上面有一个按钮。 现在,当我运行我的应用程序时,按钮会自动获得焦点 问题是我的表单的KeyPress事件不起作用,因为按钮已聚焦 我试过这个.Focus()打开FormLoad()事件,但按键事件仍不起作用 尝试将窗体的属性设置为True。您需要覆盖窗体的属性。这是当子控件具有键盘焦点时,通知您发生按键事件的唯一方法 示例代码: protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
现在,当我运行我的应用程序时,按钮会自动获得焦点 问题是我的表单的
KeyPress
事件不起作用,因为按钮已聚焦
我试过这个.Focus()代码>打开FormLoad()
事件,但按键事件仍不起作用 尝试将窗体的属性设置为True。您需要覆盖窗体的属性。这是当子控件具有键盘焦点时,通知您发生按键事件的唯一方法
示例代码:
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
// look for the expected key
if (keyData == Keys.A)
{
// take some action
MessageBox.Show("The A key was pressed");
// eat the message to prevent it from being passed on
return true;
// (alternatively, return FALSE to allow the key event to be passed on)
}
// call the base class to handle other key events
return base.ProcessCmdKey(ref msg, keyData);
}
至于为什么this.Focus()
不起作用,那是因为表单本身不能拥有焦点。特定控件必须具有焦点,因此当您将焦点设置为窗体时,它实际上会将焦点设置为第一个可以接受具有最低TabIndex
值的焦点的控件。在本例中,这是您的按钮。我将使用以下选项之一:
将按钮的TabIndex属性设置为0
将按钮的IsDefault属性设置为true-因此,按下ENTER键时将触发该属性
在主窗体上设置keyPreview=true我遇到了同样的问题,我知道这个问题很久以前就得到了回答,但我对这个问题的解决方案来自另一个堆栈溢出问题,在这个问题中,我唯一的按钮抓住并保持焦点。我接受了用户的建议,创建了一个无法获得焦点的按钮
也许有人会发现这很有用:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace I2c_Programmer {
class NoSelectButton : Button{
public NoSelectButton() {
SetStyle(ControlStyles.Selectable, false);
}
}
}
进入您的设计器,在那里创建按钮并切换出新系统…使用新类“new NoSelectButton();”button可以,但是当我的按钮也有keyPress事件时,两个keyPress事件都将被触发。这不是一个好的解决方案。它不适用于所有可能的键,它不能防止控件窃取键事件,而且它更像是一种老式的VB6处理方式。重写ProcessCmdKey
是惯用的方法。@CodyGray:但是,当目标是接收KeyPress
事件时,这是一种合适的替代方法。显然,在使用它时需要小心,但它通常比尝试将特定的键事件映射到字符更容易/更简单。嗯,他说,当加载表单时,按钮具有焦点,因此我只能假设当用户按下Enter(或空格)键时,它已经在响应。问题并没有具体说明他想要抓住的某个键;我怀疑它可能不是Enter。请注意ProcessCmdKey()不是按键的替代品。虚拟键和它们被翻译成的字符之间有很大的区别。没有好的方法可以获得与按键相同的效果。