在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:
有可以使用钩子函数。
原文地址:https://www.cnblogs.com/ljy339/p/7507085.html