对于按键消息,WM_CHAR 也一样,我敢肯定地告诉你你将会失败,为什么,问题就是出在WM_CHAR上,你可以试一试,当你不把光标移动到Edit控件时,对话框可以捕获到WM_CHAR消息,但是一旦你把光标移动到Edit控件时,就捕获不到WM_CHAR了.

出现了这种情况,有什么方法可以捕获到WM_CHAR呢?我想对于MFC编程,小Case了,只需重载PreTranslateMessage.可是对于Windows编程,利用API来写有点麻烦,这里我提供2种方法来达到变为大写的目的.

在对话框程序中,我们经常是利用对话框上的子控件进行命令响应来处理一些事件。如果我们想要让

对话框(子控件的父窗口)类来响应我们的按键消息,我们可以通过ClassWizard对WM_KEYDOWN消息进行

响应,当程序运行后,我们按下键盘上的按键,但对话框不会有任何的反应。这是因为在对话框程序中,

某些特定的消息,例如按键消息,它们被Windows内部的对话框过程处理了(即在基类中完成了处理,有

兴趣的读者可以查看MFC的源代码),或者被发送给子控件进行处理,所以我们在对话框类中就捕获不到

按键的消息了。
      既然我们知道了这个处理的过程,我们就可以找到底层处理按键消息的函数,然后在子类中重载它,

就可以在对话框程序中处理按键消息了。在MFC中,是利用BOOL ProcessMessageFilter(int code, LPMSG

lpMsg)这个虚函数来过滤或响应菜单和对话框的特定Windows消息。下面我们通过程序给大家演示基于对

话框的应用程序对WM_KEYDOWN消息的捕获。

第一步:新建一个工程,选择MFC AppWizard (exe),工程名为KeyPress,点击ok,进入下一步,选择

Dialog based,点击Finish。

第二步:在CKeyPressApp类中增加一个类型为HWND,变量名m_hwndDlg的public的变量。

第三步:在CKeyPressApp类中的InitInstance()函数中初始化m_hwndDlg=NULL

第四步:在CKeyPressDlg类中的OnInitialDialog()函数中添加:
 ((CKeyPressApp*)AfxGetApp())->m_hwndDlg=m_hWnd;  //将对话框的句柄传递到CWinSunApp类中。

第五步:在CKeyPressApp类中Add Virtual Function,选择ProcessMessageFilter

BOOL CKeyPressApp::ProcessMessageFilter(int code, LPMSG lpMsg)
{
    if(m_hwndDlg!=NULL)
    {
       //判断消息,如果消息是从对话框发出的或者其子控件发出的,我们就进行处理。
       if((lpMsg->hwnd==m_hwndDlg) || ::IsChild(m_hwndDlg,lpMsg->hwnd))
       {
          if(lpMsg->message==WM_KEYDOWN) //如果消息是WM_KEYDOWN,我们就弹出一个消息框。
          {
              AfxMessageBox(L"捕获WM_KEYDOWN消息成功!");
          }
       }
    }
    return CWinApp::ProcessMessageFilter(code, lpMsg);
}

第六步:在对话框窗口销毁后,将CKeyPressApp类中的变量m_hwndDlg置为NULL,为此我们在

CKeyPressDlg类上点击右键,选择Add Windows Message Handler,在左边一栏中选择WM_DESTROY,在右

边按钮上选择Add and Edit,然后加入以下代码:

void CWinSunDlg::OnDestroy() 
{
    CDialog::OnDestroy();
    ((CWinSunApp*)AfxGetApp())->m_hwndDlg=NULL;
}

如果我们想捕获WM_KEYUP或WM_CHAR消息,也是类似。

对话框响应WM_KEYDOWN消息相关推荐

  1. 对话框不响应WM_KEYDOWN消息,可以通过重载BOOL PreTranslateMessage(MSG * pMsg)来实现

    对话框程序中,如果不响应WM_KEYDOWN消息,可以通过重载PreTranslateMessage(MSG* pMsg)来实现 如下例: BOOL CShowImageDlg::PreTransla ...

  2. 基础语法篇_8——MFC:如何在对话框程序中让对话框捕获WM_KEYDOWN消息

  3. MFC对话框程序中添加工具栏及工具栏上的Button响应UPDATE_COMMAND_UI消息

    对话框中添加工具栏及工具栏上的Button响应UPDATE_COMMAND_UI消息 在对话框程序中添加工具栏其实很简单,网上能找到很多的例子.一般的步骤就是:1.在资源中添加工 具栏资源:2.在对话 ...

  4. 学习 Message(3): 响应 WM_LBUTTONDOWN 消息

    本例效果图: 代码文件: unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Contr ...

  5. Ajax的五种接收响应头消息(常用)

    学习本文你得先了解php与Ajax 我的PHP初探 Ajax的了解与应用 五种响应头消息 1. textt/plain 字符串 服务端的消息响应头:header("Content-Type: ...

  6. MFC对话框响应ON_UPDATE_COMMAND_UI事件

    以对话框为父窗口创建的菜单,菜单响应函数可以写在对话框类中. 菜单响应函数的映射和普通菜单响应映射一样. 但是菜单状态更新命令,需要特殊处理. BEGIN_MESSAGE_MAP(CDlg, CDia ...

  7. MFC单文档程序响应菜单消息的顺序

    在MFC中,新建一个单文档应用程序,将生成四个类: 在消息传递过程中,一般对于单文档类来说,对菜单的响应顺序是View类 --- Doc类---- MainFrame----- App: 新建一个单文 ...

  8. Visual C++——无法响应WM_LBUTTONDBLCLK消息(鼠标左键双击)问题解决方案

    问题描述 在建立win32窗口项目的时候,发现窗口无法响应WM_LBUTTONDBLCLK(鼠标左键双击)消息. MSDN https://docs.microsoft.com/en-us/previ ...

  9. 循环定时向qq对话框中发送消息

    在qq中重复发消息,利用网上的操作代码,自己定义了一个类,用多线程和定时实现对一个qq弹窗循环定时发消息.https://github.com/Wn-Dev/qq_send_messages # 原理 ...

最新文章

  1. 【FFmpeg】FFmpeg中操作目录、文件的接口
  2. Caught exception java.lang.interruptedException(在集群上进行多个文件合并压缩时出错)
  3. 非你所想:eigrp非等价负载均衡
  4. 给企业老总的一封信(一)
  5. 单片机小白学步系列(十七) 单片机/计算机系统概述:核心模块
  6. [vue] 你知道vue中key的原理吗?说说你对它的理解
  7. VirtualBox 上安装Debian 后分辨率设置
  8. 解密Go协程的栈内存管理
  9. sql语句select group by order by where一般先后顺序
  10. c#绝对值函数图像_图像处理评价指标之模糊度、清晰度(待更新)
  11. 开发APP不搞清楚这20个问题,必然沦为一场灾难
  12. python爬虫项目报告需求分析_网络爬虫需求分析报告
  13. MySQL之23:59:59进位
  14. numpy 数组的旋转、上下翻转、镜像
  15. 软件工程项目基于java的wc实现
  16. MobaXterm安装
  17. 【超好玩的路由环路系列】2——汇总环路
  18. 公众号开发--模板消息推送中文乱码问题
  19. linux 5识别网卡,redhat Linux 5.0 如何识别网卡和安装驱动
  20. 练习 ~黑马程序员匠心之作-第二阶段实战-P72~P83-通讯录管理系统

热门文章

  1. jsonarray转化list对象_第8篇:Cython的面向对象--Python类 vs Cython扩展类
  2. 完美的代价(蓝桥杯)
  3. 安卓9 webview打开指定url报错或者空白
  4. 判断QButtonGroup中哪个QRadioButton被选中
  5. day02-虚拟环境安装
  6. Android性能优化 笔记
  7. java后台发送请求并获取返回值(续)
  8. Java混乱的日志体系(logback)(转)
  9. 深入浅出linux三剑客之awk必杀技一例
  10. 浅析HTML文档结构对DivCSS布局的意义