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:
    有可以使用钩子函数。
  • 相关阅读:
    错题集-index.html
    面向对象-原型
    jQuery案例
    jQuery报错
    关于《哈利波特》书的购买方案
    《大道至简》读后感
    网络助手之NABCD
    返回一个二维整数数组中最大联通子数组的和
    返回一个二维整数数组中最大子数组的和。
    返回一个整数数组中最大子数组的和(环)(已更正)
  • 原文地址:https://www.cnblogs.com/ljy339/p/7507085.html
Copyright © 2011-2022 走看看