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

    你可能感兴趣的文章
    Spring security之管理session
    查看>>
    paramiko模块
    查看>>
    param[:]=param-lr*param.grad/batch_size的理解
    查看>>
    spring mvc excludePathPatterns失效 如何解决spring拦截器失效 excludePathPatterns忽略失效 拦截器失效 spring免验证拦截器不起作用
    查看>>
    Spring Cloud 之注册中心 EurekaServerAutoConfiguration源码分析
    查看>>
    Parrot OS 6.2 重磅发布!推出全新 Docker 容器启动器
    查看>>
    Parrot OS 6.3 发布!全面提升安全性,新增先进工具,带来更高性能
    查看>>
    ParseChat应用源码ios版
    查看>>
    Part 2异常和错误
    查看>>
    Pascal Script
    查看>>
    Spring Boot集成Redis实现keyspace监听 | Spring Cloud 34
    查看>>
    Spring Boot中的自定义事件详解与实战
    查看>>
    Passport 密码模式
    查看>>
    Spring Boot(七十六):集成Redisson实现布隆过滤器(Bloom Filter)
    查看>>
    passwd命令限制用户密码到期时间
    查看>>
    Spring @Async执行异步方法的简单使用
    查看>>
    PAT (Basic Level) Practice 乙级1021-1030
    查看>>
    PAT (Basic Level) Practice 乙级1031-1040
    查看>>
    PAT (Basic Level) Practice 乙级1041-1045
    查看>>
    SparkSql的元数据
    查看>>