如何在C#中的Windows面板控件中获取按键事件

10

我希望在C#中获取Windows面板控件的按键事件,有人可以帮帮我吗...


1
点击面板。属性的第二个选项卡(面板的属性)显示它可以触发的事件。双击KeyPressEvent,完成! - RvdK
1
@PowerRoy,那样行不通,Panel没有公开KeyPressEvent方法。它只公开了PreviewKey事件。 - James
如果在mousedown事件中将焦点设置到面板上,PreviewKey就能正常工作。 - TaW
4个回答

13

您应该处理 Panel.KeyPress 事件。

示例

public void MyKeyPressEventHandler(Object sender, KeyPressEventArgs e)
{
    ... do something when key is pressed.
}

...

(MyPanel as Control).KeyPress += new KeyPressEventHandler(MyKeyPressEventHandler);

你好,谢谢。实际上我无法获取面板控件的 Keypress 事件处理程序,你能告诉我如何获取吗? - ratty
只需尝试James编写的示例即可。(MyPanel作为控件)。如果您在其中写入(MyPanel作为控件),则会出现.KeyPres,其中MyPanel是您的Windows面板控件。 - Adrian Fâciu
10
我知道这个时机有点晚,但是 Panel Control 需要被聚焦才能接收与按键相关的事件,而单纯点击面板并不能自然地使其聚焦。你可以通过在 Panel 的 MouseDown 事件处理程序中调用 MyPanel.Focus() 来绕过这个问题。一旦 Panel 获得了焦点,那么 KeyUp、KeyDown 和 KeyPress 事件就会生效,即使父窗体上没有激活 KeyPreview。 - user1689175
@user1689175 这是一个相当老的答案,实际上,如果你现在检查文档,它们指出使用Panel.KeyPress是不推荐的。然而,你需要看一下所提出的问题,因为它是一个直截了当的问题,给出了一个直截了当的答案,但没有提供任何背景信息。 - James

9
问题是,一开始你的主表单会接收到 KeyPress 消息并立即将其发送给活动控件。如果该控件无法处理此按键,则会向上冒泡到父控件等等。
要拦截这个链条,在你的 Form.KeyPreview 设置为 true 并添加一个处理器到 Form.KeyPress。现在你就可以在表单中处理按下的键了。

3

“面板”对象无法正确接收“KeyPress”事件。

我已经创建了 Panel 重载:

public class PersoPanel : Panel

并使用了被覆盖的方法ProcessCmdKey

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)

拦截按键:
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    MessageBox.Show("You press " + keyData.ToString());

    // dO operations here...

    return base.ProcessCmdKey(ref msg, keyData);
}

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接