通过DLL方式,使用全局键盘钩子(WH_KEYBOARD_LL),运行程序后,键盘钩子有效,但大约15分钟后,键盘钩子就失效了。   把界面从CHtmlView换成CView后,就一切正常。   恳请哪位大侠提点一点,小弟先谢过。

解决方案 »

  1.   

    十分感谢tabby兄弟~~~~~
    请问怎么看虚拟内存的使用情况?我刚才折腾了一下,把成员函数OnInitialUpdata()中的Navigate2注释掉,钩子就不会失效。 也就是说一装入页面就会出现钩子失效的情况void Ctest_htmlView::OnInitialUpdate()
    {
    CHtmlView::OnInitialUpdate();
    //Navigate2(_T("http://www.msdn.microsoft.com/visualc/"),NULL,NULL);  (把这个注释掉钩子就不会失效了)
    }主程序使用MFC,钩子的DLL文件没使用MFC,是纯WIN32 API编的。 是不是我的DLL处理得不完善?或者有什么需要注意的地方? 望各位能提点一下
      

  2.   

    没有用过CHtmlView,所以只是考虑会不会是CHtmlView本身存在的问题导致异常,因为CHtmlView好像存在内存泄漏的问题:http://support.microsoft.com/kb/241750/zh-cn
      

  3.   

    多谢热心的tabby大大,问题已经解决,是自己的功力不够造成的失误,为帖子完整,把问题说一下。程序结构:MFC程序以DLL的方式调用全局键盘钩子
    症    状:当界面用CVIEW类时,钩子正常运行. 但当用CHtmlView做界面时,运行一会后钩子自动失效。
    原因如下:
    在DLL的入点函数线程退出的时候 放了一条卸下钩子的语句(用***...标识了),具体如下:
    BOOL APIENTRY DllMain( HMODULE hModule,
                           DWORD  ul_reason_for_call,
                           LPVOID lpReserved
     )
    {
    thisModule=(HINSTANCE)hModule; //保存DLL的句柄
    switch(ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    break;
    case DLL_THREAD_ATTACH:
    break;
    case DLL_PROCESS_DETACH:
    break;
    case DLL_THREAD_DETACH:
    ***(就是这条语句造成的)   if(Hook!=NULL) UnhookWindowsHookEx(Hook); //DLL退出时清除钩子
    break;
    }    return TRUE;
    }---------------------------------------------------------------------------------------------------
    后来经测试得知,使用CHtmlView类时,装载页面后,会自动不定时出现多次DLL卸载的事件。希望有人能解答一下,THANKS A LOT.
      

  4.   

    原来帖子还有送分功能,把分给tabby,只有20分,希望不要嫌小,多谢支持。