C# - 在打开上下文菜单时检测是否保持SHIFT键

Chr*_*son 39 c# keyboard contextmenu

在我的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);
 }
Run Code Online (Sandbox Code Playgroud)

如果GetKeyState是正确的方法,我的代码是否正确检测到按下了SHIFT键?

Jar*_*Par 68

您可以使用控件上的ModifierKeys静态属性来确定是否保留shift键.

if (Control.ModifierKeys == Keys.Shift ) { 
  ...
}
Run Code Online (Sandbox Code Playgroud)

这是一种旗帜式枚举,但根据您的情况,您可能希望进行更严格的测试.

另请注意,这将检查在检查值时是否保持Shift键.不是启动菜单打开的时刻.这可能不是您的应用程序的重大差异,但值得注意.

  • 应该使用:Control.ModifierKeys.HasFlag(Keys.Shift) (10认同)

bob*_*lex 39

用它来检测是否按下了shift键:

if ((Control.ModifierKeys & Keys.Shift) == Keys.Shift) 
Run Code Online (Sandbox Code Playgroud)

  • 这将检查是否按下了Shift键,这是原始问题所需要的.另一个答案检查是否仅按下Shift键. (13认同)

小智 14

它实际上比任何一个都简单得​​多

            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 */
            }
Run Code Online (Sandbox Code Playgroud)

只需确保您的项目引用PresentationCore和WindowsBase


Fas*_*ack 6

Keyboard.Modifiers也适用于实际的 WPF 项目!
另外我建议不要使用它,Keyboard.GetKeyStates因为后者使用触发并且可能无法反映真实的按键状态。

另请注意,仅当shift按下修饰键且没有其他任何操作时才会触发:

if(Keyboard.Modifiers == ModifierKeys.Shift)
{ ... }
Run Code Online (Sandbox Code Playgroud)

如果您只想检测该shift键是否被按下,是否按下了另一个修饰键,请使用这个:

if((Keyboard.Modifiers & ModifierKeys.Shift) == ModifierKeys.Shift)
{ ... }
Run Code Online (Sandbox Code Playgroud)