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