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

时间:2009-06-10 04:51:17

标签: c# keyboard contextmenu

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

我目前正在使用GetKeyState API来检查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键?

5 个答案:

答案 0 :(得分:65)

您可以使用ModifierKeys static property控制来确定是否保留了shift键。

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

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

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

答案 1 :(得分:38)

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

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

答案 2 :(得分: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 */
            }

确保您的项目引用PresentationCore和WindowsBase

答案 3 :(得分:3)

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

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

答案 4 :(得分:3)

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

另请注意,只有在 shift 修饰键关闭且没有其他内容时才会触发此操作:

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

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

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