web-dev-qa-db-ja.com

C#-コンテキストメニューを開くときにShiftキーが押されているかどうかを検出する

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

現在、GetKeyState AP​​Iを使用してShiftキーをチェックしています。私のコンピューターでは正常に動作しますが、英語以外のWindowsを使用しているユーザーは、まったく動作しないと言います。

また、コンテキストメニューが開かれたときにWin32 APIで、メニューにEXTENDEDVERBSを表示する必要があることを示すフラグがあることも読みました。 C#では、EventArgsイベントのOpeningには、EXTENDEDVERBSを示すプロパティが含まれていないか、修飾キーが押されているかどうかがわかりません。

Opening」イベント内で現在使用しているコードは次のとおりです。

// 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キーが押されていることを適切に検出しますか?

37
Chris Thompson

コントロールで ModifierKeys静的プロパティ を使用して、Shiftキーが保持されているかどうかを判断できます。

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

ただし、これはフラグスタイルの列挙型なので、状況に応じて、より厳密なテストを行うことができます。

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

66
JaredPar

これを使用して、Shiftキーが押されているかどうかを検出します。

if ((Control.ModifierKeys & Keys.Shift) == Keys.Shift) 
39
bobbyalex

実際にはそれよりもずっと簡単です

            if( Keyboard.IsKeyDown(Key.LeftCtrl) || 
                Keyboard.IsKeyDown(Key.RightCtrl) ||
                Keyboard.IsKeyDown(Key.LeftAlt) ||
                Keyboard.IsKeyDown(Key.RightAlt) ||
                Keyboard.IsKeyDown(Key.LeftShift) ||
                Keyboard.IsKeyDown(Key.RightShift))
            {
                /** do something */
            }

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

14
Stephen Punak

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

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

Keyboard.Modifiersは、実際のWPFプロジェクトでも動作します!
また、Keyboard.GetKeyStatesは、後者がトリガーを使用し、実際のキー状態を反映しない場合があるためです。

また、これは次の場合にのみトリガーされることに注意してください。 shift 修飾キーが押されており、他に何もない:

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

単に検出したい場合 shift キーが押されている場合、別の修飾キーが押されているかどうかにかかわらず、これを使用します。

if((Keyboard.Modifiers & ModifierKeys.Shift) == ModifierKeys.Shift)
{ ... }
3
FastJack