15

Visual Studio IDE や Microsoft Office のように、複合キーボード ショートカットを任意のコマンドに関連付けることができるコンポーネントを作成したいと考えています。

つまり、Ctrl+ W+などの一連の複数のキーストロークで構成されるキーボード ショートカットCです。Visual Studio では、クラス ビューが開きます。キーの最初のセットが押されると ( Ctrl+ W)、メッセージ「(Ctrl + W) が押されました。和音の 2 番目のキーを待っています...」というメッセージがステータス バーに表示されます。

4

5 に答える 5

14

特にキーボードコードの質問に答えて、現時点で利用できる既製のオプションがあるとは思いません。

ただし、モデル化するには十分に単純である必要があります。おそらく、単一のクラスを作成しますKeyboardChordProvider。フォームレベルでのキーボードイベントについて知る必要があります。他の場所で述べられているように、Form.KeyPreviewプロパティはである必要がありますtrue。このプロバイダーがForm.KeyPressイベントにサブスクライブするだけで十分な場合があります。フォームを渡した場合は、プロバイダーのコンストラクターでこれらすべてを実行できます。

潜在的なキーストロークをプロバイダーに登録する必要があります。

内部的に、このインスタンスは現在の状態を追跡します。コードの最初のキーを表すキーストロークが観察されるたびに、プロバイダーの状態を更新し、イベントを発生させて、サブスクライバーがテキストを設定できるようにします:(CTRL + W)が押されました。コードの2番目のキーを待っています...

次のキーストロークが潜在的なセカンダリオプションと一致する場合、一致があり、ChordPressed入力されたストロークの詳細を含むイベントを発生させる可能性があります。または、コードが登録されたときにプロバイダーに渡された特定のコールバックを呼び出すこともできます(ChordPressedイベントハンドラーにswitchステートメントやその他のディスパッチが含まれないようにするため)。

いつでも、キーストロークが潜在的な次のオプションと一致しない場合は、プロバイダーの状態をリセットします。

プロバイダーの内部では、ツリー構造を使用して可能なキーストロークをモデル化できます。プロバイダーの現在の状態は、特定のツリーノードにすぎません。最初は、ルートノードがアクティブになります。子がキーストロークに一致すると、次のストロークを見越して現在のノードになります。子がリーフノードである場合、コード全体が一致し、ChordPressedイベントを発生させるか(そのポイントに到達したストロークのチェーンを渡す)、リーフに格納されているコールバックを呼び出します。子に一致するキーストロークがない場合は常に、ルートノードをアクティブにするようにリセットします。

このデザインはあなたが望むものを達成すると思います。

于 2008-10-11T10:17:49.623 に答える
2

メニュー コントロールには、値を割り当てることができるShortCutという名前のプロパティがあります。そのショートカット キーを押すと、そのメニュー項目が呼び出されます。対応するメニューを持つコマンドにそのプロパティを使用します。

メニューで使用できないショートカットが必要な場合は、フォームまたはコントロールのいずれかでKeyUpまたはKeyDownイベントを介して自分で処理する必要があります。KeyEventArgsオブジェクトがハンドラーに渡され、どのキーが押されたか、Ctrl、Alt、または Shift キーも押されたかどうかを確認できます。

MSDN のサンプル コード:

// Handle the KeyDown event to determine the type of character entered into the control.
private void textBox1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{
    // Initialize the flag to false.
    nonNumberEntered = false;

    // Determine whether the keystroke is a number from the top of the keyboard.
    if (e.KeyCode < Keys.D0 || e.KeyCode > Keys.D9)
    {
        // Determine whether the keystroke is a number from the keypad.
        if (e.KeyCode < Keys.NumPad0 || e.KeyCode > Keys.NumPad9)
        {
            // Determine whether the keystroke is a backspace.
            if(e.KeyCode != Keys.Back)
            {
                // A non-numerical keystroke was pressed.
                // Set the flag to true and evaluate in KeyPress event.
                nonNumberEntered = true;
            }
        }
    }
    //If shift key was pressed, it's not a number.
    if (Control.ModifierKeys == Keys.Shift) {
        nonNumberEntered = true;
    }
}
于 2008-10-10T16:33:38.743 に答える
0

キーボードショートカットの範囲によって異なります。ツールバーを使用せずにフォームの任意のコントロールからキーボードショートカットを使用する場合は、次のように設定します。

Form.KeyPreview = true;

フォームに。これにより、すべてのキープレスイベントをフォームレベルでKeyPressKeyDown、およびKeyUpイベントによってフィルタリングできるようになり、すべてのユーザーコントロールの機能を複製する代わりに、単一のキーボードショートカットを1つの場所で処理できるようになります。

MSDN:Form.KeyPreviewプロパティ

于 2008-10-10T19:48:00.707 に答える
0

フォームのOnKeyPressedイベントを使用して、eventArgs引数で目的のキーの組み合わせが押されたかどうかを確認します

于 2008-10-10T16:12:59.753 に答える
0

一部の回答に加えて、ボタンまたはメニュー項目のキャプションにアンパサンドを使用すると、下線が引かれ、Alt+ アンパサンド & を前に付けた文字を使用してアクセスできます。

つまり、&Fileというキャプションが付いたメニュー項目がある場合、F の下に下線が表示され、ユーザーはAlt+をクリックしてメニューをトリガーできますF

于 2008-10-10T17:37:30.847 に答える