48

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

現在、GetKeyStateAPI を使用して 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 キーが押されたことを正しく検出していますか?

4

5 に答える 5

83

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

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

これはフラグ スタイルの列挙型ですが、状況によっては、より厳密なテストを行う必要がある場合があります。

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

于 2009-06-10T04:58:11.050 に答える
44

これを使用して、シフト キーが押されたかどうかを検出します。

if ((Control.ModifierKeys & Keys.Shift) == Keys.Shift) 
于 2009-06-10T05:14:58.143 に答える
19

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

            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を参照していることを確認してください

于 2014-02-28T19:10:50.873 に答える
3

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

if(Keyboard.Modifiers == ModifierKeys.Shift) {
    ...
}
于 2013-10-25T08:00:42.257 に答える