48

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

我目前正在使用GetKeyStateAPI 来检查 SHIFT 键。它在我的电脑上运行良好,但非英语 Windows 的用户说它根本不适合他们。

我还在 Win32 API 中读到,当打开上下文菜单时,有一个标志指示菜单中应该显示EXTENDEDVERBS. 在 C# 中EventArgs,事件的 forOpening不包含(据我所知)指示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

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

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 回答
4

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

另请注意,仅当shift修改键按下且没有其他内容时才会触发:

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

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

if((Keyboard.Modifiers & ModifierKeys.Shift) == ModifierKeys.Shift)
{ ... }
于 2017-06-14T09:54:07.260 回答
3

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

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