Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何检测上下文菜单(winforms)上每次按下一个键的情况?_C#_.net_Winforms_Events_Contextmenustrip - Fatal编程技术网

C# 如何检测上下文菜单(winforms)上每次按下一个键的情况?

C# 如何检测上下文菜单(winforms)上每次按下一个键的情况?,c#,.net,winforms,events,contextmenustrip,C#,.net,Winforms,Events,Contextmenustrip,在Winforms应用程序中,我使用ContextMenuStrip(右键单击通知图标时显示) 我想检测上下文菜单项打开时是否按下了键(例如:注册到事件) 与大多数控件不同,ContextMenuStrip上没有KeyDown事件。 但是,有一个PreviewKeyDown事件。 我已注册参加该活动,但它没有按预期工作 这是我的上下文菜单: Item1 Item2 SubMenu > SubItem1 SubItem2 如果在Item1高亮显示(鼠标在上面)时按下某个

在Winforms应用程序中,我使用
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(例如:可用于键盘记录器)不满意。你的解决方案好多了。