C# 如何检测上下文菜单(winforms)上每次按下一个键的情况?
在Winforms应用程序中,我使用C# 如何检测上下文菜单(winforms)上每次按下一个键的情况?,c#,.net,winforms,events,contextmenustrip,C#,.net,Winforms,Events,Contextmenustrip,在Winforms应用程序中,我使用ContextMenuStrip(右键单击通知图标时显示) 我想检测上下文菜单项打开时是否按下了键(例如:注册到事件) 与大多数控件不同,ContextMenuStrip上没有KeyDown事件。 但是,有一个PreviewKeyDown事件。 我已注册参加该活动,但它没有按预期工作 这是我的上下文菜单: Item1 Item2 SubMenu > SubItem1 SubItem2 如果在Item1高亮显示(鼠标在上面)时按下某个
ContextMenuStrip
(右键单击通知图标时显示)
我想检测上下文菜单项打开时是否按下了键(例如:注册到事件)
与大多数控件不同,ContextMenuStrip
上没有KeyDown
事件。
但是,有一个PreviewKeyDown
事件。
我已注册参加该活动,但它没有按预期工作
这是我的上下文菜单:
Item1
Item2
SubMenu > SubItem1
SubItem2
如果在Item1
高亮显示(鼠标在上面)时按下某个键,则会触发事件。但是,如果我在突出显示子项1
时按下一个键,则不会发生任何事情
如果未突出显示任何项目,则会发生相同的行为:
如果仅打开关联菜单(未突出显示任何项目),则会触发事件。
如果打开子上下文菜单(未突出显示任何项目),则不会触发事件
以下是所需的一些代码示例:
//MainForm.cs
void ContextMenuStrip1PreviewKeyDown(object sender, EventArgs e)
{
MessageBox.Show("OK"); //not always called, as explained above
}
//MainForm.Designer.cs (generated automatically by form designer)
this.contextMenuStrip1.PreviewKeyDown +=
new System.Windows.Forms.PreviewKeyDownEventHandler(this.ContextMenuStrip1PreviewKeyDown);
要在上下文菜单条打开时检测Shift键状态,作为一个选项,您可以处理事件并使用以下功能检查键状态:
[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
public static extern short GetKeyState(int keyCode);
public const int KEY_PRESSED = 0x8000;
public static bool IsKeyDown(Keys key)
{
return Convert.ToBoolean(GetKeyState((int)key) & KEY_PRESSED);
}
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
Application.Idle += Application_Idle;
}
void Application_Idle(object sender, EventArgs e)
{
if (!contextMenuStrip1.Visible)
return;
if (IsKeyDown(Keys.ShiftKey))
someMenuItem.Text = "Shift is Down";
else
someMenuItem.Text = "Shift is Up";
}
protected override void OnFormClosed(FormClosedEventArgs e)
{
Application.Idle -= Application_Idle;
base.OnFormClosed(e);
}
PreviewKeyDown
-您能显示您的代码吗我添加了一些代码您想要检测按键的实际要求/原因是什么?这看起来像是XY问题。我想检测是否已按下shift键来更改某些特定菜单项的文本。我曾尝试使用GetAsyncKeyState()
和计时器执行类似的操作。然而,我知道一些防病毒软件对太多频繁调用该api(例如:可用于键盘记录器)不满意。你的解决方案好多了。