应用程序中键盘消息从WM_KEYFIRST到WM_KEYLAST那么多,但我们知道最原始的键盘消息 只有两个那就是WM_KEYDOWN,WM_KEYUP,在键盘钩子中我们能截获的也就这两个消息,那其它消息是从何产生的,如何动作的呢?下面我们就 WM_CHAR消息来分析一下。
一个键按下后,便会有一个或多个WM_KEYDOWN消息产生,这些消息会从系统消息队列发送到目标窗口的线程的消息队列中,这样在对应线程处理消息时便会对此消息处理,并在处理的过程中产生一系列的其它键盘消息,其中便有WM_CHAR。
以下是向对话框中的编辑框输入’a’的部分处理过程(以所附源码调试、整理而得)
CGetInputDlg::DoModal() //对话框创建
往编辑框按下一键’a’
001 CGetInputDlg::RunModalLoop //消息循环,在这里peek到WM_KEYDOWN
002 CGetInputDlg::PumpMessage //消息泵,取消息、翻译、处理这些消息
003 CGetInputDlg::PreTranslateMessage //线程开始消息预处理
004 CGetInputDlg::WalkPreTranslateTree //从目标窗口到主窗口历遍
005 CMyEdit::PreTranslateMessage //目标窗口,没有处理(返回FALSE)。
006 CGetInputDlg::PreTranslateMessage //子窗口没有处理,所以流到父窗口
007 CDialogDlg::PreTranslateMessage //由基类处理
...
008 CMyEdit::WindowProc
009 CMyEdit::OnWndMsg
010 CMyEdit::OnKeyDown
011 CMyEdit::DefWindowProc
012 CGetInputDlg::RunModalLoop //在这里peek到WM_CHAR,不过一般情况下之间会有几个WM_KICKIDLE
...
<
WM_KEYDOWN --> 调用TranslateMessage --> WM_CHAR --> WM_KEYUP 分析WM_CHAR
最新推荐文章于 2021-12-06 00:16:15 发布