在表单级别捕获功能键而不显示菜单项冲突

时间:2017-07-21 17:56:36

标签: .net winforms keydown key-events

我开发了一个Windows窗体应用程序(.NET 4.6,VS.2017),我有两种形式,主窗体和非模态窗体。在这两种形式中,我需要抓住用户按 F2键这是应用程序使用的唯一功能键,没有为任何其他功能键定义的其他快捷键

在这两种形式中,我启用了Form.KeyPreview ,默认情况下为false。然后我还实现了 KeyDown事件,并在其中检查它是否是我的功能键:

private void myView_KeyDown(object sender, KeyEventArgs e)
{
   if (e.KeyCode == Keys.F2)  // breakpoint placed here!
   {
        // perform action
        e.Handled = true;
   }
}

请注意我在IF语句上放置了一个断点,检查按下了哪个键,而不是在操作块中。

现在我的非模态形式无论我选择哪个功能键都能正常工作。

但是,主窗体使用相同的代码表现出奇怪的行为。如果在主要表单中我使用' e.KeyCode == Keys.F3'然后断点触发所有其他功能键按下除了F3。

所以,然后我改变了if语句,而不是检查F2而不是F3。但是现在有了这个改变,断点会触发除F2之外的所有功能键,所以之前没有工作的F3(当检查F3时)现在可以正常工作但是F2没有。

无论我选择哪个功能键,断点都会触发所有功能键,除了我选择的功能键。

以下是捕获...在我的一个ToolStripMenuItems中,我也放置了相同的功能键作为快捷键,因为它们完成相同的操作(然后用户不必按Alt G,然后按Alt而不是使用F2直接。

因此,如果我从ToolStripMenuItem中删除快捷方式,那么我的表单KeyDown按预期工作但是没有用户的视觉提示他可以使用F2来完成该功能。这里奇怪的是,tooltripmenuitem和表单都不会对所选的功能键做出反应。

我可以做什么才能使快捷方式适用于工具条菜单项和表单级别?

1 个答案:

答案 0 :(得分:0)

在测试将MenuStripITem的ShortcutKeys属性设置为'F2'后,我能够得到你提到的行为。单击菜单项或点击F2都执行了按钮的处理程序代码。我没有更改KeyPreview属性,也没有实现KeyDown。我认为摆脱这些不必要的代码会对你有帮助。