在您的表单中覆盖 ProcessCmdKey 明确旨在允许您在按钮和菜单项中的内置助记符处理之外实现自定义快捷键处理。
它只在按键按下事件上被调用,之前具有焦点的控件获得 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。当您想要做一些不寻常的事情(例如检查重复键)时,您可以解释 msg 数据。检查 MSDN 文档以获取 WM_KEYDOWN 通知。 msg.LParam 值包含一堆关于击键的信息。
请注意,您只能在此方法中获得 virtual 键。 Keys.F 是英文键盘布局上的 F 键,但不一定是用户布局上相同位置的键的相同字母。使用功能键可以避免文档问题。
按键重复是键盘控制器的一项功能,不仅限于键入按键。按住时箭头和功能键肯定会重复。在这种情况下,您想忽略 KeyPress。但是,如果您为同时也是键入键的键(如 Keys.F)分配快捷键,那么您希望始终同时检查修饰键,以免破坏 TextBox 等控件。
最后但同样重要的是,不要忘记按钮和菜单项控件中内置的助记符支持。编写像&OK 这样的 Text 属性会生成一个自记录的快捷方式,而无需任何代码。由用户操作,在本例中,通过键入 Alt+O。