在表单中重写 ProcessCmdKey 的目的是明确允许您实现超出按钮和菜单项中内置助记符处理的自定义快捷键处理。
它仅在按键按下事件时被调用,before无论哪个客户端控件具有焦点,具有焦点的控件都会获取 KeyDown 事件。因此不与 KeyUp 关联,也不与 KeyPress 关联。执行快捷功能后,当您识别出该键时,您会从覆盖中返回 true。这可以防止按键被进一步处理,它不会生成任何 KeyDown/Press/Up 事件。
使用该方法的情况非常罕见msg该方法的参数中,msg.Msg 值只能是 WM_KEYDOWN 或 WM_SYSKEYDOWN,后一条消息是在用户按住 Alt 键时生成的。你并不关心这个,因为你总是可以从keyData争论。像这样:
protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
if (keyData == (Keys.Alt | Keys.F)) {
// Alt+F pressed
doSomething();
return true;
}
return base.ProcessCmdKey(ref msg, keyData);
}
您可能需要使用 | 检查其他修饰符这里使用的运算符是 Keys.Shift 和 Keys.Control。因此 (Keys.Shift | Keys.Control | Keys.F1) 检查 Ctrl+Shift+F1。你can当您想要执行一些不寻常的操作(例如检查重复键)时,请解释消息数据。检查 MSDN 文档中的 WM_KEYDOWN 通知。 msg.LParam 值包含一系列有关击键的信息。
请注意,您只会得到virtual该方法中的键。 Keys.F 是英文键盘布局上的 F 键,但不一定与用户布局上相同位置的键具有相同的字母。优先使用功能键以避免文档麻烦。
按键重复是键盘控制器的一项功能,并不限于键入按键。按住箭头和功能键时肯定会重复。在这种情况下您想忽略 KeyPress。但是,如果您为同时也是打字键的键分配快捷键(例如 Keys.F),那么您想要always还要检查修饰键,这样就不会破坏 TextBox 等控件。
最后但并非最不重要的一点是,不要忘记按钮和菜单项控件中对助记符的内置支持。像这样编写他们的 Text 属性&OK
无需任何代码即可生成自记录快捷方式。由用户操作,在此示例中,通过键入 Alt+O。