在我的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键?
答案 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)
{ ... }