博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MFC对话框不能响应键盘消息
阅读量:5732 次
发布时间:2019-06-18

本文共 1137 字,大约阅读时间需要 3 分钟。

在MFC中,对话框程序在完成程序的初始化后,就在程序主线程中,调用CWinThread::Run函数。在该函数中,首先调用API函数PeekMessage,而函数PeekMessage检查线程消息队列,如果消息存在,就将该消息放于指定的MSG结构中,以后的消息处理都将针对这一MSG结构对象。捕获消息后,该函数将捕获的消息进行预处理,然后再将消息传递给相应的窗口处理函数。    键盘消息被拦截而得不到正常响应,其中的关键就是Run函数对消息的预处理。在Run函数中,调用了函数CWinThread::PumpMessage,就是利用这一函数,MFC实现了对消息的分流,使得消息沿着MFC对各种消息规定的路线流动,直到被正确响应。    函数PumpMessage调用了函数CWinThread::PreTranslateMessage对消息进行处理,如果该函数不对消息进行处理,则调用API函数TranslateMessage函数将虚拟键消息转换为字符消息并调用DispatchMessage分发消息给窗口处理程序。在对话框中,程序用CWinThread::PreTranslateMessage函数处理了键盘消息,所以对话框程序是否要响应键盘消息,将完全由CWinThread::PreTranslateMessage函数来决定了。    在CWnd及其派生类的成员函数PreTranslateMessage函数是一个虚函数,可以通过重载来改变其处理过程。在默认情况下,没有重载这一函数。例子如下,在VC6的Class view中找到相应的对话框类单击右键,在右键菜单中选择Add Virtual Fuction...项,然后找到PreTranslateMessage虚函数进行加载。相应的代码中如下:BOOL CKeyinTstDlg::PreTranslateMessage(MSG* pMsg)    //CKeyinTstDlg我为自己创建的对话框类{ // TODO: Add your specialized code here and/or call the base classif(WM_KEYFIRST<=pMsg->message&&pMsg->message<=WM_KEYLAST) {   m_KeyCode=1;   m_KeyName="dsfsdf";MessageBox("有键被按下");pdateData(FALSE); } return CDialog::PreTranslateMessage(pMsg);}

 

转载于:https://www.cnblogs.com/cwbo-win/articles/3394361.html

你可能感兴趣的文章
页面留白问题
查看>>
leetcode 【 Best Time to Buy and Sell Stock II 】python 实现
查看>>
推荐15款创建漂亮幻灯片的 jQuery 插件
查看>>
【算法】CRF
查看>>
windows 8 微软拼音输入法
查看>>
Windows UI风格的设计(7)
查看>>
3. 指针的赋值
查看>>
linux小常识
查看>>
SQL中使用WITH AS提高性能 使用公用表表达式(CTE)简化嵌套SQL
查看>>
聊聊TaskExecutor的spring托管
查看>>
oracle 强行杀掉一个用户连接
查看>>
Git提交本地库代码到远程服务器的操作
查看>>
挨踢部落故事汇(13):扬长避短入行Oracle开发
查看>>
灾难拯救——让软件项目重回轨道
查看>>
ssh链接git服务器,解决push pull要求输入密码问题
查看>>
Netty 源码解析(二):对 Netty 中一些重要接口和类的介绍
查看>>
MAVEN spring boot 打包 和执行
查看>>
mysql中主外键关系
查看>>
第七章:数据字典
查看>>
python 字符串 类型互相转换 str bytes 字符串连接
查看>>