C#UserControl键盘快捷键

时间:2012-06-29 12:15:22

标签: c# user-controls keyboard-shortcuts

我创建了一个用户控件,它有多个文本框,组合框等。用户控件托管在普通表单上。我想为文本框,组合框分配键盘快捷方式。因此,当按住Ctrl + F时,焦点将放在其中一个文本框上。我已经尝试使用OnPreviewKeyDown来检查密钥,然后在用户控件上触发密钥关闭方法。调试器甚至没有命中窗体上的OnPreviewKeyDown方法。我已经在表单上启用了keyPreview。我在下面提供了一些实验。

有谁可以指出我哪里出错了?我无法相信这样的事情是如此困难。我一定很遗憾。感谢

protected override void OnPreviewKeyDown(PreviewKeyDownEventArgs e)
    {
        Keys k = e.KeyCode;

        UserControl1.UserControl_KeyPress(k);
    }

    public void UserControl_KeyPress(object sender, KeyPressEventArgs e)
    {
        if (e.KeyChar == 'F')
            tbxHostName.Focus();

        switch (e.KeyCode)
        {
            case Keys.F:
                this.cmbxProtocol.Focus();
                break;
            case Keys.H:
                this.tbxHostName.Focus();
                break;
            default:
                break;
        }
    }

1 个答案:

答案 0 :(得分:1)

我建议您尝试KeyDown Event。它接受一个KeyEventArgs参数,其中包含一个专门用于Ctrl键的布尔值(KeyEventArgs.Control)。

在您的情况下,您会将KeyCode属性与Keys.F进行比较,以查看是否按下了F,并检查Control是否为真。例如:

public void UserControl_KeyDown(object sender, KeyEventArgs e) 
{ 
    if (e.Control)
    {
        switch (e.KeyCode) 
        { 
            case Keys.F: 
                this.cmbxProtocol.Focus(); 
                break; 
            // Other cases ...
            default: 
                break; 
        }
    }
} 

或者,如果你真的想坚持你的KeyPress事件,你可以检查静态Control.ModifierKeys属性的值,看看是否按下了Ctrl键,如下所示:

if( (Control.ModifierKeys & Keys.Control) == Keys.Control )
{
    //...
}