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

    你可能感兴趣的文章
    NSRange 范围
    查看>>
    NSSet集合 无序的 不能重复的
    查看>>
    NSURLSession下载和断点续传
    查看>>
    NSUserdefault读书笔记
    查看>>
    NS图绘制工具推荐
    查看>>
    NT AUTHORITY\NETWORK SERVICE 权限问题
    查看>>
    NT symbols are incorrect, please fix symbols
    查看>>
    ntelliJ IDEA 报错:找不到包或者找不到符号
    查看>>
    NTFS文件权限管理实战
    查看>>
    ntko web firefox跨浏览器插件_深度比较:2019年6个最好的跨浏览器测试工具
    查看>>
    ntko文件存取错误_苹果推送 macOS 10.15.4:iCloud 云盘文件夹共享终于来了
    查看>>
    ntp server 用法小结
    查看>>
    ntpdate 通过外网同步时间
    查看>>
    NTPD使用/etc/ntp.conf配置时钟同步详解
    查看>>
    NTP及Chrony时间同步服务设置
    查看>>
    NTP服务器
    查看>>
    NTP配置
    查看>>
    NUC1077 Humble Numbers【数学计算+打表】
    查看>>
    NuGet Gallery 开源项目快速入门指南
    查看>>
    NuGet(微软.NET开发平台的软件包管理工具)在VisualStudio中的安装的使用
    查看>>