如果键盘键入的是“Ctrl+D”,则应该选择WM_KEYDOWN,因为WM_KEYDOWN既包含字母也包含特殊字符。
WM_CHAR是由WM_KEYDOWN消息Translate()之后产生的,然后再发送给窗口过程。例如按下“D”键,产生WM_KEYDOWN消息,此消息经过Translate()处理后变成了WM_KEYDOW、WM_CHAR两个消息传递给窗口过程。
而WM_SYSKEYDOWN是接受快捷键或系统命令按键的,像Alt键就是。所以捕获Alt键时,在WM_KEYDOWN下是无效的,要在WM_SYSKEYDOWN中。Ctrl和shift不属于WM_SYSKEYDOWN。
键盘消息的处理从PreProcessMessage方法开始,按下表所述的逻辑顺序进行。(了解这个过程或许有助于对上面三个消息的理解)
方法 | 说明 | 结果 |
ProcessCmdKey | 此方法检查按键是否为命令键,例如快捷键或菜单快捷键 | 如果方法返回true,则将不调度键消息,而且将不发生键事件 如果方法返回false,则将调用IsInputKey检查该键是否为常规输入键 |
IsInputKey | 此方法检查按键是否为常规输入键 | 如果方法返回true,则表示该键为常规字符,将调用ProcessKeyMessage进行消息处理 如果方法返回false,则将调用ProcessDialogKey |
ProcessDialogKey | 此方法检查按键是否为导航键,例如Esc、Tab、回车键或箭头键。 如果该控件不处理该键,则将调用基控件或父控件的ProcessDialogKey,直至层次结构中的最顶端控件。 |
如果此方法返回true,则完成消息预处理,而且将不生成键事件 如果此方法返回false,则将调用ProcessKeyMessage进行消息处理 |
ProcessKeyMessage | 此方法处理由控件的WndProc方法接收的所有键盘消息 | 如果控件有父级,则调用父级的ProcessKeyPreview 如果控件没有父级或父级的ProcessKeyPreview不处理该消息,则调用ProcessKeyEventArgs |
ProcessKeyPreview | 此方法将键盘消息发送到控件的父控件 | 如果此方法返回true,则将不发生键事件 如果此方法返回false,则将调用ProcessKeyEventArgs |
ProcessKeyEventArgs | 此方法引发KeyDown事件 |