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

本文共 1556 字,大约阅读时间需要 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/

    你可能感兴趣的文章
    Numpy 科学计算库详解
    查看>>
    Numpy.fft.fft和numpy.fft.fftfreq有什么不同
    查看>>
    numpy.linalg.norm(求范数)
    查看>>
    Numpy.ndarray对象不可调用
    查看>>
    Numpy.VisibleDeproationWarning:从不整齐的嵌套序列创建ndarray
    查看>>
    Numpy:按多个条件过滤行?
    查看>>
    Numpy:条件总和
    查看>>
    numpy、cv2等操作图片基本操作
    查看>>
    numpy中的argsort的用法
    查看>>
    NumPy中的精度:比较数字时的问题
    查看>>
    numpy判断对应位置是否相等,all、any的使用
    查看>>
    Numpy多项式.Polynomial.fit()给出的系数与多项式.Polyfit()不同
    查看>>
    Numpy如何使用np.umprod重写range函数中i的python
    查看>>
    numpy学习笔记3-array切片
    查看>>
    numpy数组替换其中的值(如1替换为255)
    查看>>
    numpy数组索引-ChatGPT4o作答
    查看>>
    numpy最大值和最大值索引
    查看>>
    NUMPY矢量化np.prod不能构造具有超过32个操作数的ufunc
    查看>>
    Numpy矩阵与通用函数
    查看>>
    numpy绘制热力图
    查看>>