[转] – C#中键盘事件在WndProc函数之前的处理流程

窗体和控件在WndProc处理函数处理键盘消息之前,都要进行预处理。本文就介绍在键盘事件被WndProc处理之前所经过的处理过程。

以下介绍是文本描述的示意介绍,和真正的代码流程(TranslateAcceleratorTranslateMessageDispatchMessage处理)有区别,仅仅便于理解。

 

在一个私有函数中进行消息的内部处理,流程如下:

 

 
  1. internal PreProcessControlMessageInternal()  
  2. {  
  3.     if(是WM_KEYDOWN 或者是 WM_SYSKEYDOWN消息)  
  4.     {  
  5.         触发PreviewKeyDown;  
  6.         if (e.IsInputKey)  
  7.         {  
  8.                 触发KeyDown事件;  
  9.                 return//不再进行PreProcessMessage预处理   
  10.         }  
  11.     }  
  12.     PreProcessMessage虚函数预处理;  
  13. }  

  

有关PreProcessMessage虚函数预处理详细流程: 

 
  1. internal PreProcessMessage()  
  2. {  
  3.     if(是WM_KEYDOWN 或者是 WM_SYSKEYDOWN消息)  
  4.     {  
  5.         if (ProcessCmdKey 虚函数处理(如快捷键或菜单快捷键))  
  6.         {  
  7.             return;  
  8.         }  
  9.         if (IsInputKey 虚函数判断是否是常规字符)  
  10.         {  
  11.             触发KeyDown事件;  
  12.             return;  
  13.         }  
  14.         if(!ProcessDialogKey 虚函数处理导航键(Esc、Tab、回车键或箭头键))  
  15.         {  
  16.             触发KeyDown事件;  
  17.             return;  
  18.         }  
  19.     }  
  20.     if(是WM_CHAR 或者是 WM_SYSCHAR消息)  
  21.     {  
  22.         if (IsInputChar 虚函数判断是否是普通字符)  
  23.         {  
  24.             触发KeyDown事件;  
  25.             return;  
  26.         }  
  27.         if(!ProcessDialogChar 虚函数处理助记符(如按钮上的“确定(&O)”))  
  28.         {  
  29.             触发KeyDown事件;  
  30.             return;  
  31.         }  
  32.     }  
  33. }  

引文来源  C#中键盘事件在WndProc函数之前的处理流程 – 田发江的专栏 – CSDN博客