计算机关机时,系统都会为每个应用程序广播发送WM_QUERYENDSESSION的消息,每个应用程序接到此消息后,都会退出来,我要最先捕获此广播消息,必须经过我的应用程序处理后,其他应用程序才能接收此消息,怎么实现。
各位大侠帮帮忙呀。小弟先谢啦!!!

解决方案 »

  1.   

    下面钩子有什么问题??????
    extern "C" __declspec(dllexport) BOOL starthook();
    extern "C" __declspec(dllexport) BOOL stophook();
    HHOOK glhHook=NULL;//安装的勾子句柄
    HMODULE hModDLL=NULL;BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fwdreason, LPVOID lpvReserved)
    {
            hModDLL = (HMODULE)hinstDLL;
            
            return 1;
    }
    //---------------------------------------------------------------------------
    LRESULT WINAPI  SysMsgProc(int nCode,WPARAM wParam,LPARAM lParam)
    {
    MSG  *pSysMsg=(MSG *)lParam;
           if (nCode<0)
    {
    return CallNextHookEx(glhHook,nCode,wParam,lParam);
    }
          // if(wParam == WM_QUERYENDSESSION)
           if( pSysMsg->wParam == WM_QUERYENDSESSION||wParam == WM_QUERYENDSESSION)
    {
                //添加代码
                ::MessageBox(NULL,"消息捕获","钩子",MB_OK);
               // pSysMsg->wParam=0;
               // pSysMsg->lParam=0;
    }
    return CallNextHookEx(glhHook,nCode,wParam,lParam);//继续传递消息
    }BOOL starthook()
    {
        //安装钩子
        glhHook=SetWindowsHookEx(WH_SYSMSGFILTER,(HOOKPROC) SysMsgProc,hModDLL,0);
        if(glhHook==NULL)
    return -1;
         return  0;
    }BOOL stophook()
    {
       //卸载钩子
    BOOL bResult=FALSE;
    if(glhHook)
    bResult= UnhookWindowsHookEx(glhHook);
    return bResult;
    }
      

  2.   

    你的程序不也会接收到WM_QUERYENDSESSION吗。这种想法能实现吗?
      

  3.   

    我也顺便问个问题,
    是不是捕捉鼠标位置即使是写在DLL里的也必须使用钩子?
    在DLL中只用ONMOUSEMOVE不行的吗?
      

  4.   

    钩子分为两种,一种是全局系统钩子,一种是局部的。
    如果想要在你的APP中影响其他的应用,必须使用全局系统钩子,就必须放在DLL中动态加载。
    反之,钩子只在你的APP中使用,hook function就直接写在你的app中好了。
      

  5.   

    [email protected]也给我一份可以吗/
      

  6.   

    [email protected]
    也给我一份,先谢谢
      

  7.   

    谢谢,最好我也来一份
    [email protected]