如何在C#中以UserControl的形式获取所有KeyPress事件?

5

我已经阅读了很多与按键事件相关的文章,但是我无法弄清楚如何获取它们。我知道只有具有键盘焦点的当前控件才会接收到按键事件。但是我该如何确保我的用户控件拥有它呢?

尝试过以下方法但没有成功:

public partial class Editor : UserControl

this.SetStyle(ControlStyles.Selectable, true);
this.TabStop = true;
...
//take focus on click
protected override void OnMouseDown(MouseEventArgs e)
{
    this.Focus();
    base.OnMouseDown(e);
}
...
protected override bool IsInputKey(Keys keyData)
{
   return true;
}

并且还有这个:
//register global keyboard event handlers
private void Editor_ParentChanged(object sender, EventArgs e)
{
    if (TopLevelControl is Form)
    {
        (TopLevelControl as Form).KeyPreview = true;
        TopLevelControl.KeyDown += FCanvas_KeyDown;
        TopLevelControl.KeyUp += FCanvas_KeyUp;
        TopLevelControl.KeyPress += FCanvas_KeyPress;
    }
}

后者给我按键按下和松开事件,但仍然没有按键事件。如果我的控件继承自UserControl,是否有其他方法可以使用来获取每个按下/松开/按下事件?
编辑: 由于有一条评论链接到了另一个SO问题:重要的是,我还需要得到KeyPress事件,因为它可以在任何语言的键盘上发送正确的字符。这对于文本写作非常重要。如果您只获取单个按键,则必须自己将其转换为正确的字符。但也许有一种方便的方法可以将按下的键转换为本地化字符?

你是否已经为窗体打开了KeyPreview? - TaW
是的,请查看第二个代码示例,第6行... - thalm
不,你提供的解决方案是针对按键按下/松开事件的。我需要的是按键按下事件,因为按键按下事件会发送每个键盘/语言的正确字符,而不是区分的按键。如果你要用它来写文本之类的东西,这很重要... - thalm
3
用户控件并不适用于此,它是其他控件的容器,其中一个会得到焦点。如果您没有任何需要容纳的控件,则不应该从UserControl继承,而应该从Control继承。 - Hans Passant
显示剩余2条评论
2个回答

4
  • 将包含用户控件的父窗体的 KeyPreview 属性设置为 true
  • 在父窗体中添加一个新的 KeyPress 事件

将父窗体的键按下事件转发到您的用户控件:

private void parentForm_KeyPress(object sender, KeyPressEventArgs e)
        {
            // Forward the sender and arguments to your usercontrol's method
            this.yourUserControl.yourUserControl_KeyPress(sender, e);
        }

yourUserControl1_KeyPress方法替换为您自己的方法,该方法每次用户按下按钮时都会运行(按钮被按下然后释放)。

您还可以创建一个新的KeyPress处理程序到您的用户控件中,并将发送者和KeyPressEventArgs对象转发到那里,就像这个例子中一样。


0

你能够附加到表单事件吗?

Private Sub MyControl_Load(sender As Object, e As EventArgs) Handles Me.Load
    Dim f = Me.FindForm
    If Not f.KeyPreview Then Throw New Exception("Form requires has Keypreview enabled")
    AddHandler f.KeyUp, Sub(sender2 As Object, e2 As KeyEventArgs)

                        End Sub
End Sub

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