2009-06-10 11 views
33

を開くとき、Shiftキーを保持しているかどうかを検出するが、ときコンテキストSHIFTキーが押されている場合、私はメニューに特別なオプションを追加したいですメニューが開きます。C#が - 私は、コンテキストメニューを表示したい私のC#アプリケーションでは、コンテキストメニュー

私は現在、SHIFTキーを確認するためにGetKeyState APIを使用しています。それは私のコンピュータ上で正常に動作しますが、英語以外のWindowsを使用しているユーザは、それが全く機能しないと言います。

私はまた、コンテキストメニューを開いたときのWin32 APIのメニューに示すフラグがEXTENDEDVERBSを示すべきでありますことをお読みください。 C#ではOpeningイベントのEventArgsは(私が言うことができるものから)EXTENDEDVERBSまたは任意の修飾キーが押された場合を示すプロパティが含まれていません。

// SHIFT KEY is being held down 
if (Convert.ToBoolean(GetKeyState(0x10) & 0x1000)) 
{ 
    _menuStrip.Items.Add(new ToolStripSeparator()); 

    ToolStripMenuItem log = new ToolStripMenuItem("Enable Debug Logging"); 
    log.Click += new EventHandler(log_Click); 
    log.Checked = Settings.Setting.EnableDebugLogging; 
    _menuStrip.Items.Add(log); 
} 

GetKeyStateはそれを行うための正しい方法がある場合は、自分のコードが正しく押されたShiftキーを検出している。

ここで私は「Opening」イベント内で、今使っているコードですか?

答えて

60

Shiftキーが開催されているかどうかを判断するためにコントロールにModifierKeys static propertyを使用することができます。

if (Control.ModifierKeys == Keys.Shift) { 
    ... 
} 

これには、状況に応じて、あなたがより厳密なテストを行いたいかもしれませんがフラグスタイルの列挙型です。

はまた、これは、Shiftキーを使用すると、値を確認した瞬間に保持されているかどうかをチェックすることに注意してください。メニューのオープンが開始された瞬間ではありません。それはあなたのアプリケーションにとって大きな違いではないかもしれませんが、それは注目に値します。

+0

残念ながら、私のコード内のContextMenuの親はUserControlであり、ModifierKeysプロパティはUserContr olまたはContextMenuオブジェクトの場合。 –

+0

@Chris - Jaredは静的だと言っています。私は彼の答えをmsdn –

+0

へのリンクで更新しました。私はそれがインスタンスのプロパティだと思っていました。私はそれをテストします。 –

37

使用シフトキーが押されているかどうかを検出するために、この:Silverlightで

if ((Control.ModifierKeys & Keys.Shift) == Keys.Shift) 
+0

私がこの答えをタイプする時までに、Jaredは既にそれを掲示していた。重複して申し訳ありません。 – bobbyalex

+0

Chrisが正しいです。このプロパティは、UserControlを使用していても使用できます。 – bobbyalex

+11

これは、Shiftキーが押されたかどうかをチェックします。これは元の質問が望んだものです。もう一つの答えはShiftキーだけが押されたかどうかをチェックします。 – adzm

3

を、少なくとも最新のバージョンでは、あなたが使用する必要があります。

if(Keyboard.Modifiers == ModifierKeys.Shift) { 
    ... 
} 
12

それが実際にそののいずれよりもはるかに簡単です

プロジェクトがPresentationCoreとWindowsBaseを参照していることを確認してください。

2

Keyboard.Modifiersも実際のWPFプロジェクトで動作します。
また、Keyboard.GetKeyStates以上の使用を推奨します。これは、後でトリガを使用し、実際のキーの状態を反映しない可能性があるためです。また

シフト修飾キーがダウンしていないと何も場合にのみトリガされますので注意してください:他の修飾子かどうか、

if(Keyboard.Modifiers == ModifierKeys.Shift) 
{ ... } 

あなただけシフトキーが押されているかどうかを検出したい場合キーが押されたかどうかは、次のようにしてください:

if((Keyboard.Modifiers & ModifierKeys.Shift) == ModifierKeys.Shift) 
{ ... } 
関連する問題