窗体和控件在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; } } }