博客
关于我
开发基于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/

    你可能感兴趣的文章
    Oracle RAC性能调整的方案
    查看>>
    oracle rac集群的东西之QQ聊天
    查看>>
    UML— 用例图
    查看>>
    Oracle Schema Objects——Tables——Table Compression
    查看>>
    oracle scott趣事
    查看>>
    oracle script
    查看>>
    Oracle select表要带双引号的原因
    查看>>
    Oracle SOA Suit Adapter
    查看>>
    Oracle Spatial GeoRaster 金字塔栅格存储
    查看>>
    Oracle spatial 周边查询SQL
    查看>>
    Oracle Spatial空间数据库建立
    查看>>
    UML— 活动图
    查看>>
    oracle sqlplus已停止工作,安装完成客户端后sqlplus报“段错误”
    查看>>
    oracle SQLserver 函数
    查看>>
    oracle sql分组(group,根据多个内容分组)在select之后from之前 再进行select查询,复杂子查询的使用
    查看>>
    UML— 时序图
    查看>>
    Oracle Statspack分析报告详解(一)
    查看>>
    oracle tirger_在Oracle中,临时表和全局临时表有什么区别?
    查看>>
    Oracle Validated Configurations 安装使用 说明
    查看>>
    oracle where 条件的执行顺序分析1
    查看>>