C#-检测在打开关联菜单时是否按住SHIFT键

C#-检测在打开关联菜单时是否按住SHIFT键,c#,keyboard,contextmenu,C#,Keyboard,Contextmenu,在我的C#应用程序中,我想显示一个上下文菜单,但如果在上下文菜单打开时按住SHIFT键,我想在菜单中添加特殊选项 我目前正在使用GetKeyStateAPI检查SHIFT键。它在我的电脑上运行良好,但使用非英语窗口的用户说它对他们根本不起作用 我还了解到,在Win32 API中,当上下文菜单打开时,有一个标志指示菜单中应该显示EXTENDEDVERBS。在C#中,打开事件的事件参数不包含(据我所知)指示扩展动词或是否按下任何修改键的属性 下面是我现在在“打开”事件中使用的代码: 如果GetKey

在我的C#应用程序中,我想显示一个上下文菜单,但如果在上下文菜单打开时按住SHIFT键,我想在菜单中添加特殊选项

我目前正在使用
GetKeyState
API检查SHIFT键。它在我的电脑上运行良好,但使用非英语窗口的用户说它对他们根本不起作用

我还了解到,在Win32 API中,当上下文菜单打开时,有一个标志指示菜单中应该显示
EXTENDEDVERBS
。在C#中,
打开
事件的
事件参数
不包含(据我所知)指示
扩展动词
或是否按下任何修改键的属性

下面是我现在在“
打开
”事件中使用的代码:

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

您可以使用on控件确定是否按住SHIFT键

if (Control.ModifierKeys == Keys.Shift ) { 
  ...
}
这是一个标志样式的枚举,所以根据您的情况,您可能需要进行更严格的测试


还要注意,这将检查在检查值时是否按住Shift键。而不是启动菜单打开时。这对您的应用程序来说可能没有太大区别,但值得注意

使用此按钮检测是否按下了shift键:

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

在silverlight中,至少在最新版本中,您必须使用:

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

事实上,这比任何一个都简单

            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

键盘。修饰符
也适用于实际的WPF项目
另外,我建议您在使用
Keyboard.GetKeyStates
时使用它,因为后者使用触发,可能无法反映真正的键状态

还要注意的是,只有当shift modifier键按下且没有其他操作时,才会触发此操作:

if(Keyboard.Modifiers == ModifierKeys.Shift)
{ ... }
如果您只想检测shift键是否按下,是否按下了另一个修改键,请使用此键:

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

不幸的是,我的代码中ContextMenu的父项是UserControl,并且ModifierKeys属性对于UserControl或ContextMenu对象都不可用。@Chris-正如Jared所说,它是静态的。我用msdnI的链接更新了他的答案,但我没有注意到。我认为这是一个实例属性。我将测试它。应该使用:Control.ModifierKeys.hasblag(Keys.Shift)当我键入这个答案时,Jared已经发布了它。对不起,重复了。克里斯是对的。即使您使用的是UserControl,属性也应该对您可用。这将检查是否按了Shift键,这正是原始问题所需要的。另一个答案检查是否只按下了Shift键。很好,也可以在WPF中工作,使用System.Windows.Input进行
不使用Microsoft.VisualBasic.Devices
if((Keyboard.Modifiers & ModifierKeys.Shift) == ModifierKeys.Shift)
{ ... }