2009-06-18 4 views
0

私はWindows.Wormsアプリケーションを持っています。私のフォームの1つでは、ContextMenu(ContextMenuStripではなく)が関連付けられたDataGridViewが表示されます。 ContextMenuのMenuItemにはショートカットが定義されています。フォームからコントロールにKeyEventを送る

Private _contextMenu As _ 
     New ContextMenu(_ 
      New MenuItem() { _ 
       New MenuItem("Item A", AddressOf ItemA_Click, Shortcut.CtrlA) With {.DefaultItem = True}, _ 
       New MenuItem("Item B", AddressOf ItemB_Click, Shortcut.CtrlB), _ 
       New MenuItem("Item C", AddressOf ItemC_Click, Shortcut.CtrlC), _ 
       ... 
      }) _ 
     With {.Name = "MyContextMenu"} 

私のDataGridViewがフォーカスを持っていると私はCtrlキー+ A ItemA_Clickが呼び出された押した場合:

これはのContextMenuを作成する方法です。
DataGridViewにフォーカスがない場合でも、ショートカットをフォーム全体で機能させたいと思います。
逆の方法は簡単でしょう、私はフォームのKeyPreviewをtrueに設定する必要があります。しかし、イベントをDataGridViewに渡したいと思います。

DataGridViewからOnKeyDownメソッドとOnKeyPressメソッドを呼び出そうとしましたが、どちらも機能していないようです。私はそれを知らないが、私はContextMenuがキーを無視すると仮定...イベントとメッセージキューにフックが、私はどのように私のSystem.Windows.Forms.KeyEventArgsをWindowsメッセージに変換するためのcluを持っていない。

ちょうど2つだと思います。
- DataGridViewにフォーカスし、私の死体の解決策としてSendKeysを使用します。
- 私はContextMenuからロジックを引き出し、KeyPreviewまたはsmthを使用することはできません。このような。

答えて

1

フォームのKeyPreviewをtrueに設定してから、自分でショートカットキーをキャッチしてみてください。あなたが押されているショートカットキーをキャッチすると、適切なメソッドを呼び出します。

private void Form_KeyDown(object sender, KeyEventArgs e) { 
    if (e.Control && e.KeyCode == Keys.A) { 
     ItemA_Click(...); 
    } else if (e.Control && e.KeyCode == Keys.B) { 
     ItemB_Click(...); 
    } else if (e.Control && e.KeyCode == Keys.C) { 
     ItemC_Click(...); 
    } 
} 
+0

(私はC#構文に慣れてると申し訳ありませんが、これは... C#の場合) をうーん...これはの問題を持っています2つの別々の場所でショートカットを処理します。つまり、ContextMenuにCtrl + Mを追加する場合は、KeyDownイベントハンドラでもそれを処理することを覚えておく必要があります。 。 。 ショートカットキーを完全にContextMenuから削除すると、ショートカットキーを扱うコードが1つだけになることがありますか? – Yoopergeek

+0

@Yoopergeek:それがポイントです。ショートカットをコンテキストメニューからフォームに移動することはできません。なぜなら、フォームは動的に作成され、フォームは存在を知らないからです。 –

関連する問題