我开发了一个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和表单都不会对所选的功能键做出反应。
我可以做什么才能使快捷方式适用于工具条菜单项和表单级别?
答案 0 :(得分:0)
在测试将MenuStripITem的ShortcutKeys属性设置为'F2'后,我能够得到你提到的行为。单击菜单项或点击F2都执行了按钮的处理程序代码。我没有更改KeyPreview属性,也没有实现KeyDown。我认为摆脱这些不必要的代码会对你有帮助。