窗体和控件在WndProc处理函数处理键盘消息之前,都要进行预处理。本文就介绍在键盘事件被WndProc处理之前所经过的处理过程。
以下介绍是文本描述的示意介绍,和真正的代码流程(TranslateAccelerator,TranslateMessage,DispatchMessage处理)有区别,仅仅便于理解。
在一个私有函数中进行消息的内部处理,流程如下:
- internal PreProcessControlMessageInternal()
 - {
 - if(是WM_KEYDOWN 或者是 WM_SYSKEYDOWN消息)
 - {
 - 触发PreviewKeyDown;
 - if (e.IsInputKey)
 - {
 - 触发KeyDown事件;
 - return; //不再进行PreProcessMessage预处理
 - }
 - }
 - PreProcessMessage虚函数预处理;
 - }
 
有关PreProcessMessage虚函数预处理详细流程:
- internal PreProcessMessage()
 - {
 - if(是WM_KEYDOWN 或者是 WM_SYSKEYDOWN消息)
 - {
 - if (ProcessCmdKey 虚函数处理(如快捷键或菜单快捷键))
 - {
 - return;
 - }
 - if (IsInputKey 虚函数判断是否是常规字符)
 - {
 - 触发KeyDown事件;
 - return;
 - }
 - if(!ProcessDialogKey 虚函数处理导航键(Esc、Tab、回车键或箭头键))
 - {
 - 触发KeyDown事件;
 - return;
 - }
 - }
 - if(是WM_CHAR 或者是 WM_SYSCHAR消息)
 - {
 - if (IsInputChar 虚函数判断是否是普通字符)
 - {
 - 触发KeyDown事件;
 - return;
 - }
 - if(!ProcessDialogChar 虚函数处理助记符(如按钮上的“确定(&O)”))
 - {
 - 触发KeyDown事件;
 - return;
 - }
 - }
 - }