0

aContextMenuStripを開いたときに、ユーザーが選択可能な文字の最初の文字を入力すると、それをクリックしたかのようになります。それを傍受して、彼がクリックしたキャラクターを取得したいと思います。

次のコードはそれを行いますが、可能な文字をハードコーディングします。キーストロークによる自動選択を無効にする(マウスクリックのみを残す)か、文字をインターセプトする方法のいずれかによって、これを行う一般的な方法が必要です。

次の簡略化されたコードは、winformTextを文字で入力し、ContextMenuStrip「A」という1つのオプションがあることを前提としています。

public Form1()
{
    InitializeComponent();
    contextMenuStrip1.KeyDown += contextMenuStrip1_KeyDown;
}

private void button1_Click(object sender, EventArgs e)
{
    contextMenuStrip1.Show();
}

void contextMenuStrip1_KeyDown(object sender, KeyEventArgs e)
{
    e.SuppressKeyPress = true;
    if (e.KeyCode == Keys.A)
    {
        if (e.Shift) Text = "A";
        else Text = "a";
    }
}

イベントが発生しないため、イベントの使用KeyPressとチェックe.KeyCharは機能しません。(代わりに「A」クリックイベントが発生します。)

次のいずれかを使用します:、、、e.KeyCodeまたはe.KeyDataキーとしてe.KeyValueを受け入れるため、(さらにハードコーディングしないと)機能しません。Shift

4

1 に答える 1

3

コメントに記載されているように、ProcessMnemonic()メソッドをオーバーライドできるように、ContextMenuStripから独自のクラスを派生させる必要があります。

これに少し注釈を付けると、Winformsではキーボード処理が非常に複雑になります。ショートカットキーストロークは、フォーカスのあるコントロールにディスパッチされる前に、非常に早い段階で処理されます。必然的に、ショートカットキーストロークを機能させるために、すべてのコントロールにKeyDownイベントを実装する必要はありません。

これは外部から内部で機能し、いくつかの保護されたメソッド、ProcessCmdKey、ProcessDialogChar、およびProcessMnemonicが含まれます。フォームのKeyPreviewプロパティが設定されている場合はOnKeyDownと同様に、VB6互換機能。そのため、フォームは最初にショットを取得し、次にコンテナから子コントロールに移動して、そこからコントロールを繰り返します。

ToolStripクラス(ContextMenuStripの基本クラス)は、ProcessMnemonic()メソッドをオーバーライドして、キーの押下を認識し、それらをメニュー項目にマッピングします。したがって、このデフォルトの処理をインターセプトするには、ProcessMnemonic()を自分でオーバーライドして、最初にキーを押したときにショットを取得する必要があります。

于 2013-01-13T18:06:11.477 に答える