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键.不是启动菜单打开的时刻.这可能不是您的应用程序的重大差异,但值得注意.
bob*_*lex 39
用它来检测是否按下了shift键:
if ((Control.ModifierKeys & Keys.Shift) == Keys.Shift)
Run Code Online (Sandbox Code Playgroud)
小智 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
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)