通常的方法是设置KeyPreview = true
后覆盖OnKeyDown
事件:
protected override void OnKeyDown(KeyEventArgs e)
{
base.OnKeyDown(e);
// your code here..
Text = "Testing: KeyCode" + e.KeyCode;
}
但是你也可以使用PreviewKeyDown
事件。确保将表格的KeyPreview
属性设置为true,并将一个公共事件添加到可能窃取/接收焦点的所有控件!
由于控制的PreviewKeyDown
事件usees需要路由事件到窗体的KeyDown
事件不同的说法:
private void CommonPreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
Form1_KeyDown(this, new KeyEventArgs(e.KeyCode));
}
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
// your code here..
Text = "Testing: KeyCode" + e.KeyCode;
}
你可能想挂钩手柄代码:
void routeKeys(Control container)
{
foreach (Control ctl in container.Controls)
if (ctl.CanFocus) ctl.PreviewKeyDown += CommonPreviewKeyDown;
}
这样称呼它:
public Form1()
{
InitializeComponent();
routeKeys(this);
}
当然您可能要添加过滤器,以防止你的表格是不会处理按键的路由..
的区别这两种技术之间是当你覆盖Form.OnKeyDown
你会从任何地方获得的KeyEvents;这将包括例如文本框中您的角色和编辑键都被路由到表单。
如果你不想,你需要一个过滤器添加到事件:
if (tb_notes.Focused) return;
if (tb_moreNotes.Focused) return;
if (rtb_edit.Focused) return;
第二种方式让我们决定哪些控制应包括或排除在路由..:
if (ctl.CanFocus && !(ctl is TextBox || ctl is RichTextBox))
ctl.PreviewKeyDown += CommonPreviewKeyDown;
来源
2016-01-16 16:38:38
TaW
将焦点设置为别的东西?你无法专注表格 - 没有什么可以关注的。您可以将屏幕外的文本框作为最后的手段。 – SimpleVar
但我必须对我的Form Keypress事件做出反应 – bravobyte
在客户端From区域(也有此keypress事件的地方)使用'mouse-down/click'事件,在该事件处理程序中移除焦点或设置为专注于另一种控制。 – Stefan