我是这样实现的:重载了DefWindowProc函数,判断是不是WM_QUERYENDSESSION消息,如果是则返回0,自己实验时,程序检测到了关机消息,但并没有阻止关机,我的代码如下:
LRESULT CGetShutDownDlg::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
{
switch (message) 
{
case WM_QUERYENDSESSION:
char tmp[10];
sprintf(tmp,"wParam = 0x%x  lParam = 0x%x",wParam,lParam);
if(lParam == 0)
{
::MessageBox(0,"收到关机或重启消息",tmp,MB_OK);

}
else
::MessageBox(0,"收到注销消息",tmp,MB_OK);

return 0;
case WM_ENDSESSION:
return 0;
}
return CDialog::DefWindowProc(message, wParam, lParam);
}
请教大家该如何实现?

解决方案 »

  1.   


    virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam);重载WindowProc函数。
      

  2.   

    重载WindowProc函数还是不能阻止关机。
    自己搜索了下,在SDK程序里,在
    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)中拦截WM_QUERYENDSESSION消息,可以阻止关机,不知是什么原因,现在想在MFC程序里实现
      

  3.   

    我试过在WindowProc阻止注销,关机也应该可以吧。
      

  4.   


    和你写SDK程序是一样的,你子类化一个MFC的顶级窗口就行了。
      

  5.   

    将你的代码中的所有的::MessageBox都去掉就行了。当MessageBox弹出来时,你后面的return FALSE就不能执行,但是系统给WM_QUERYEDNSESSION的预留时间却不是无限的,在一定时间内不返回FALSE,它就关机。
      

  6.   

    谢谢各位,去掉::MessageBox后,可以了,程序运行后,可以阻止关机了,但发现原来的按钮不再响应了,下面是代码:
    LRESULT CGetShutDown_MFCDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
    {
    switch (message) 
    {
    case WM_QUERYENDSESSION:
    return 0;
    case WM_ENDSESSION:
    return 0;
    default:
    return CDialog::DefWindowProc(message, wParam, lParam);
       }
       return 0;
    }
    是不是因为重载WindowProc后引起的呢?该怎么处理呢?
      

  7.   

    MFC程序为什么要写WindowProc呢?直接在对话框中处理WM_QUERYENDSESSION消息不就行了。
      

  8.   

    不是说了吗,直接处理WM_QUERYENDSESSION消息就行了,返回FALSE就行了。
    比如写成这样:
    BOOL CMy999Dlg::OnQueryEndSession()
    {
    if (!CDialog::OnQueryEndSession())
    return FALSE; // TODO:  在此添加专用的查询结束会话代码

    return FALSE;
    //return TRUE;
    }
      

  9.   

    使用wltg2001的方法可以了,感谢wltg2001,感谢大家
      

  10.   

    ...........
    这样就行了。
    LRESULT CMFCTestDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
    {
    if (message == WM_QUERYENDSESSION)
    return 0; return CDialog::WindowProc(message, wParam, lParam);
    }