是这样的,我要写一个DLL,别人调用这个DLL的时候会传一个HWND的参数进来。我必须在传进来的这个窗口销毁之前做一些处理操作。
所以我设想在DLL中开启一个钩子钩住HWND所在的线程,然后在HWND销毁之前来做处理操作。
一开始,开启一个WH_CALLWNDPROC,在WM_DESTROY中处理的时候,用断点发现此时窗口已经不见了(窗口有DxShow视频播放,此时却已经听不到声音了)。如果在WM_CLOSE里面处理,那时窗口倒是还在,处理也成功了,但是如果是点窗口的取消按钮而不是又上角的X,那就没有WM_CLOSE消息生成。
另外一个是WH_CBT,不过回调函数的那几个参数,不知道怎么去解释利用,而且也不知道是否能成功。
最后一个WH_GETMESSAGE,好像也是不行。我到底应该用哪个钩子好?在哪个消息里面处理可以一劳永逸呢?望有经验的前辈指点。

解决方案 »

  1.   

    为什么认为WH_GETMESSAGE不行,就用它试试
      

  2.   

    WH_GETMESSAGE试过了,能钩钩WM_PAINT之类的消息,WM_CLOSE和WM_DESTROY消息都钩不到
      

  3.   

    DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
    {
    // 如果使用 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;   // 确定
    }
      

  4.   

    没想到结帖了也有热心人回帖,呵呵,先谢谢了,不过我遇到的问题不是LS的这个问题。
    我遇到的是,比如一个DLL有个导出函数void fun(HWND hwnd),现在我必须在传进来的hwnd参数销毁之前做处理,而这个时候DLL并没有被释放,所以不能在DLL_PROCESS_DETACH里面处理。的确是要WH_CBT钩子才能解决。