是这样的,我要写一个DLL,别人调用这个DLL的时候会传一个HWND的参数进来。我必须在传进来的这个窗口销毁之前做一些处理操作。
所以我设想在DLL中开启一个钩子钩住HWND所在的线程,然后在HWND销毁之前来做处理操作。
一开始,开启一个WH_CALLWNDPROC,在WM_DESTROY中处理的时候,用断点发现此时窗口已经不见了(窗口有DxShow视频播放,此时却已经听不到声音了)。如果在WM_CLOSE里面处理,那时窗口倒是还在,处理也成功了,但是如果是点窗口的取消按钮而不是又上角的X,那就没有WM_CLOSE消息生成。
另外一个是WH_CBT,不过回调函数的那几个参数,不知道怎么去解释利用,而且也不知道是否能成功。
最后一个WH_GETMESSAGE,好像也是不行。我到底应该用哪个钩子好?在哪个消息里面处理可以一劳永逸呢?望有经验的前辈指点。
所以我设想在DLL中开启一个钩子钩住HWND所在的线程,然后在HWND销毁之前来做处理操作。
一开始,开启一个WH_CALLWNDPROC,在WM_DESTROY中处理的时候,用断点发现此时窗口已经不见了(窗口有DxShow视频播放,此时却已经听不到声音了)。如果在WM_CLOSE里面处理,那时窗口倒是还在,处理也成功了,但是如果是点窗口的取消按钮而不是又上角的X,那就没有WM_CLOSE消息生成。
另外一个是WH_CBT,不过回调函数的那几个参数,不知道怎么去解释利用,而且也不知道是否能成功。
最后一个WH_GETMESSAGE,好像也是不行。我到底应该用哪个钩子好?在哪个消息里面处理可以一劳永逸呢?望有经验的前辈指点。
{
// 如果使用 lpReserved,请将此移除
//UNREFERENCED_PARAMETER(lpReserved); if (dwReason == DLL_PROCESS_ATTACH)
{
TRACE0("mydll.DLL 正在初始化!\n");
// 扩展 DLL 一次性初始化
if (!AfxInitExtensionModule(mydllDLL, hInstance))
return 0; // 将此 DLL 插入到资源链中
// 注意: 如果此扩展 DLL 由
// MFC 规则 DLL (如 ActiveX 控件)隐式链接到,
// 而不是由 MFC 应用程序链接到,则需要
// 将此行从 DllMain 中移除并将其放置在一个
// 从此扩展 DLL 导出的单独的函数中。使用此扩展 DLL 的
// 规则 DLL 然后应显式
// 调用该函数以初始化此扩展 DLL。否则,
// CDynLinkLibrary 对象不会附加到
// 规则 DLL 的资源链,并将导致严重的
// 问题。 new CDynLinkLibrary(mydllDLL); }
else if (dwReason == DLL_PROCESS_DETACH)
{
TRACE0("mydll.DLL 正在终止!\n"); // 在调用析构函数之前终止该库
HWND hwnd=(HWND)lpReserved;//在此处理
CWnd wnd;
wnd.Attach(hwnd);
wnd.MessageBox(TEXT("yes"));//处理结束
AfxTermExtensionModule(mydllDLL);
}
return 1; // 确定
}
我遇到的是,比如一个DLL有个导出函数void fun(HWND hwnd),现在我必须在传进来的hwnd参数销毁之前做处理,而这个时候DLL并没有被释放,所以不能在DLL_PROCESS_DETACH里面处理。的确是要WH_CBT钩子才能解决。