1

複数のテキスト ボックス、コンボ ボックスなどを持つユーザー コントロールを作成しました。ユーザー コントロールは通常のフォームでホストされます。テキスト ボックス、コンボ ボックスにキーボード ショートカットを割り当てたいと考えています。そのため、Ctrl + F を同時に押すと、テキスト ボックスの 1 つにフォーカスが置かれます。OnPreviewKeyDown を使用してキーを調べ、ユーザー コントロールでキー ダウン メソッドを起動しようとしました。デバッガーは、フォームの OnPreviewKeyDown メソッドにもヒットしません。フォームの keyPreview を true に設定しました。以下に私の実験のいくつかを提供しました。

誰かが私が間違っているところを指摘できますか? こんな難しいことが信じられない。私は単純なものが欠けているに違いありません。ありがとう

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を試すことをお勧めします。Ctrl キー専用のブール値 ( KeyEventArgs.Control ) を含むKeyEventArgsパラメーターを受け取ります。

あなたの場合、 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 に答える