博客
关于我
开发基于MFC的ActiveX控件的时候的一些消息处理
阅读量:410 次
发布时间:2019-03-04

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

MFC ActiveX控件在IE中消息处理的问题

作为开发人员,处理基于MFC的ActiveX控件在IE中的消息问题可能会遇到一些挑战。特别是在涉及窗口和消息处理时,可能会遇到消息无法正常接收的情况。以下将详细讨论该问题及其解决方案。

症状

当使用基于MFC的ActiveX控件作为容器时,可能会遇到以下症状:

  • TAB键、箭头键和加速键无法正常工作
  • 模态对话框或属性表窗口的键盘焦点丢失
  • 某些关键消息无法通过PreTranslateMessage方法处理

原因

这些问题的根源在于MFC ActiveX控件的消息循环机制:

  • 消息接收机制:ActiveX控件的消息主要由其容器处理,而不是控件本身
  • PreTranslateMessage函数:该函数在某些情况下不会被调用,导致无法处理特定消息类型
  • UI-Activate机制:IE只在用户在控件上点击鼠标时激活控件,否则可能不会自动激活
  • 解决方案

    要解决这些问题,可以采取以下步骤:

  • 在OnInit函数注册全局钩子:截获系统消息,确保MFC ActiveX控件能够处理所有消息
  • 消息回调函数处理PreTranslateMessage:在回调函数中调用PreTranslateMessage,处理对话框和加速键消息
  • 确保UI-Activate:在控件创建时或鼠标点击时手动激活,确保消息能够正常传递
  • 实施步骤

    1. 安装全局钩子

    在CxxxCtrl的OnInit函数中注册全局钩子,截获消息:

    HHOOK hHook = ::SetWindowsHookEx(WH_GETMESSAGE, GetMessageProc, AfxGetInstanceHandle(), GetCurrentThreadId());

    Ensure that the hook procedure GetMessageProc correctly handles the message translation.

    2. 消息回调处理

    在GetMessageProc中调用PreTranslateMessage,确保对话框和加速键消息被处理:

    LPMSG lpMsg = (LPMSG) lParam;if (PM_REMOVE == wParam && lpMsg->message >= WM_KEYFIRST && lpMsg->message <= WM_KEYLAST) {    AfxGetApp()->PreTranslateMessage((LPMSG)lParam);}

    如果消息已被处理,转换为WM_NULL,避免重复处理。

    3. 确保UI-Activate

    在控件创建时手动激活:

    int CMyActiveXCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct) {    if (COleControl::OnCreate(lpCreateStruct) == -1) {        return -1;    }    OnActivateInPlace(TRUE, NULL);    return 0;}

    确保在有焦点时控件保持UI-Active状态。

    步骤到复现问题

  • 使用MFC ActiveX Control Wizard创建一个简单的ActiveX控件
  • 在控件中嵌入一个模式对话框或属性表窗口
  • 在OnInit中安装全局钩子,并实现消息回调函数
  • 测试TAB键和箭头键是否正常工作
  • 结果

    通过以上方法,可以确保基于MFC的ActiveX控件在IE中正确接收和处理消息,解决键盘焦点丢失和加速键问题。这种方法有效地结合了钩子截获和PreTranslateMessage处理,确保了消息的完整传递。

    转载地址:http://gxbg.baihongyu.com/

    你可能感兴趣的文章
    npm设置淘宝镜像、升级等
    查看>>
    npm设置源地址,npm官方地址
    查看>>
    npm设置镜像如淘宝:http://npm.taobao.org/
    查看>>
    npm配置安装最新淘宝镜像,旧镜像会errror
    查看>>
    NPM酷库052:sax,按流解析XML
    查看>>
    npm错误 gyp错误 vs版本不对 msvs_version不兼容
    查看>>
    npm错误Error: Cannot find module ‘postcss-loader‘
    查看>>
    npm,yarn,cnpm 的区别
    查看>>
    NPOI
    查看>>
    NPOI之Excel——合并单元格、设置样式、输入公式
    查看>>
    NPOI初级教程
    查看>>
    NPOI利用多任务模式分批写入多个Excel
    查看>>
    NPOI在Excel中插入图片
    查看>>
    NPOI将某个程序段耗时插入Excel
    查看>>
    NPOI格式设置
    查看>>
    NPOI设置单元格格式
    查看>>
    Npp删除选中行的Macro录制方式
    查看>>
    NR,NF,FNR
    查看>>
    nrf24l01+arduino
    查看>>
    nrf开发笔记一开发软件
    查看>>