1

我创建了一个具有多个文本框、组合框等的用户控件。用户控件托管在普通表单上。我想为文本框、组合框分配键盘快捷键。因此,当同时按下 Ctrl + F 时,焦点将放在其中一个文本框上。我尝试使用 OnPreviewKeyDown 检查键,然后在用户控件上触发 key down 方法。调试器甚至没有点击表单上的 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;
        }
    }
4

1 回答 1

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 )
{
    //...
}
于 2012-06-29T12:23:52.450 回答