我在程序中对ID_APP_EXIT重写了函数,使得程序退出时必须先通过密码验证才能退出。但考虑到用户可以点击窗体的右上角的关闭键仍可以退出,于是我用下面代码禁止关闭功能:
         //获得系统菜单
CMenu *pMenu=GetSystemMenu(FALSE); //获得关闭按钮的ID
int x=pMenu->GetMenuItemCount();
UINT pID=pMenu->GetMenuItemID(x-1); //使关闭按钮无效
pMenu->EnableMenuItem(pID, MF_DISABLED);
但是令人失望的是还是可以通过Alt-F4来结束本程序。也就是说,右上角的关闭键和Alt-F4都不会响应ID_APP_EXIT的消息。高手们,为什么?

解决方案 »

  1.   

    add WM_SYSCOMMAND message handler, check the flag SC_CLOSE
      

  2.   

    在你程序的OnSysCommand()处理函数中加入:
      if(nID==SC_CLOSE) 
      {
        //在这里加入你想处理的东西
      }
      

  3.   

    响应MainFrame的WM_CLOSE消息。在OnClose()中做你的密码验证。
    ID_APP_EXIT,Alt+f4,右上角的关闭按钮都是要关闭窗口。所以,相应关闭窗口的消息就行了。
      

  4.   

    楼上的(52001314)说得对哦;如果象你说的那样做, 你不要响应alt+F4按键就行了, 就是在加速器里, 把值删掉
      

  5.   

    补充一下, 贴主也可使菜单失效,可以用命令更新的 ON_UPDATE_COMMAND_UI(ID_YOUMENU_EXIT,YOUFOUNCTION)在YOUFOUNCTION里处理, 然后在合适的时候使用命令更新.这样用alt+F4也是没用的, 就是使菜单变灰