zoukankan      html  css  js  c++  java
  • 在DLL对话框中截获鼠标按下的消息

    问题描述:
    现在需要在对话框的按钮被点击之前拦截或检测到该动作,并提前进行一些遇处理,然后再响应该消息。
    解决办法:
    开始用PreTranslateMessage和WindowProc进行消息拦截,发现没有效果,经百度得知,是因为对话框在DLL中,导致这两个函数无法响应 。
    方案1:
    百度提供了下面一种解决方案

    PreTranslateMessage是标准窗口的消息预处理响应函数,在任何标准窗口有效。
    DLL中窗口的创建是在一个导出函数中,并在调用CWnd::Create这前调用了
    AFX_MANAGE_STATE(AfxGetStaticModuleState())来切换模块线程状态,导致该窗口所在的模块线程状态和MFC调用CWinApp::PreTranslateMessage时的不同,所以DLL中的窗口就无法响应PreTranslateMessage函数了。
    解决方案:
    1.dll导出一条函数 DllPreTranslateMessage
    BOOL PASCAL DllPreTranslateMessage(MSG *pMsg)
    {
    AFX_MANAGE_STATE(AfxGetStaticModuleState());
    return theApp.PreTranslateMessage(pMsg);
    }
    2.在主程序的CWinApp的PreTranslateMessage中直接调用DLL的DllPreTranslateMessage函数。但记住要先调用DLL中的函数。
    BOOL CMyApp::PreTranslateMessage(MSG* pMsg)
    {
    // TODO: Add your specialized code here and/or call the base class
    if(DllPreTranslateMessage(pMsg))
    return TRUE;
    return CWinApp::PreTranslateMessage(pMsg);
    }
    经过以上两步,DLL中的窗口就可以响应PreTranslateMessage了。 

    但感觉有些繁琐。

    方案2:
    最终使用了OnCommand虚函数进行响应,正确解决了该问题。
    方案3:
    有可以使用钩子函数。
  • 相关阅读:
    排序算法比较及其应用
    confluence wiki 安装
    hbase优缺点
    maven nexus私服搭建
    IntelliJ Idea 2017 免费激活方法
    presto-cli通过hive查询hdfs
    monit拉起服务
    MAC nginx代理设置
    kafka-manager安装
    flume从log4j收集日志输出到kafka
  • 原文地址:https://www.cnblogs.com/ljy339/p/7507085.html
Copyright © 2011-2022 走看看