OnQueryEndSession与OnEndSession函数

来源:互联网 发布:硅谷办公室装修 知乎 编辑:程序博客网 时间:2024/06/05 11:12

OnQueryEndSession与OnEndSession函数  

2009-06-04 16:44:06|  分类: VC++|举报|字号 订阅

  下载LOFTER我的照片书  |
        WM_QUERYENDSESSION消息是Windows向你询问Windows能否关闭,WM_ENDSESSION消息表示提示你Windows即将关闭。故当应用程序退出时, WM_QUERYENDSESSION消息和WM_ENDSESSION消息均不响应。也就是说也就是说,你的程序在运行状态时,而系统由于某种原因需要注销或重启(或关机),此时操作系统会向你询问,但到你的同意(返回TRUE)后,系统才能做进一步的操作。

       Windows 在注销、重起、关机之前会向每个当前正在运行的应用程序发送WM_QUERYENDSESSION消息,
 --> 如果该应用程序方便关闭的话,则在此消息的消息响应函数OnQueryEndSession()中返回非0值(TRUE),否则返回0值(FALSE)。
--> 如果当前系统正在运行的应用程序全部返回非0值,则Windows的注销、重起、关机过程继续下去,并且向所有运行的应用程序发送WM_ENDSESSION消息,并且消息参数为TRUE;
--> 如果当前系统正在运行的应用程序其中之一返回0值,则Windows的注销、重起、关机过程被终止,并且不再继续对剩余的应用程序调用OnQueryEndSession()消息响应函数,而是向已经调用过了OnQueryEndSession()消息响应函数的应用程序发送WM_ENDSESSION消息,并且消息参数为FALSE。
        所以一个应用程序只要响应WM_ENDSESSION消息,并在WM_ENDSESSION消息的消息响应函数OnEndSession(BOOL bEnding) 中根据参数bEnding来判断系统最后是否真的要注销、重起、关机了,然后做出适当的反应即可。
 
*******************************************************************************************************************************************
       有三个消息看起来差不多,都是处理关闭的事情的,它们是WM_CLOSE,WM_DESTROY,和WM_QUIT。它们的确很相似,但你需要知道它们之间的不同!一个窗口或者应用程序应该被关闭时发出WM_CLOSE消息,当接收到WM_CLOSE消息时,如果你愿意,可以向用户提出是否真的要退出。你知道让用户作确认或有错误出现或有什么应该注意的事情发生的时候,往往弹出一个消息框。
 插播:消息框
   int MessageBox(
   HWND hWnd, // handle of owner window
   LPCTSTR lpText, // address of text in message box
   LPCTSTR lpCaption, // address of title of message box
   UINT uType // style of message box
   ); 
  
  1. 当收到WM_CLOSE消息,你可以做两件事儿。一件是你接受默认的处理并返回一个值,你若这样做了,应用程序或窗口按照计划关闭;或者,你返回0,应用程序或窗口将保持原样。以下是代码的基本部分:
   if (msg == WM_CLOSE)
   {
   if (MessageBox(hMainWindow, "Are you sure want to quit?", "Notice", MB_YESNO | MB_ICONEXCLAMATION) == IDNO)
   return(0);
   // otherwise, let the default handler take care of it
   } 
  
  2. WM_DESTROY消息有点儿不同,它是窗口正在关闭时发出的当收到WM_DESTROY消息的时候,窗口已经从视觉上被删除;但一个主窗口被关闭,并不意味着应用程序结束了,因为它可以在没有窗口的条件下继续运行。
  
  3. 然而,当一个用户关闭了主窗口,并希望这意味着是要结束应用程序时,如果你希望真的这么做,那么在收到WM_DESTROY消息的时候,你必须发出一个WM_QUIT消息

  4.  WM_QUIT是应用程序结束发出的消息,一般可以看成进程被kill掉的情况。
 
       5. PostQuitMessage是向系统发出要终止线程的请求,在终止线程前系统还要做些内存的清理工作。
 
我们关闭一个程序时是发送WM_CLOSE消息(函数SendMessage?),然后调用DestroyWindow函数,调用DestroyWindow时系统会向程序发WM_DESTROY消息,终止整个程序。
*****************************************************************************************************************************************
使用批处理执行启动程序,程序获取批处理中的命令行参数
建一个对话框工程TestCmdLine,把下面这段代码加进去:   
  BOOL   CTestCmdLineDlg::OnInitDialog()   
  {   
  CDialog::OnInitDialog();   
   ... ...
  //   TODO:   Add   extra   initialization   here   
  int   argc=0;   // 记录命令行参数个数
  LPWSTR   *argv=::CommandLineToArgvW(::GetCommandLineW(),&argc);   // 返回命令行参数,并存入argv中
    
  for(int   i=0;i<argc;i++)   
  {   
    CString   msg=argv[i];   
    MessageBox(msg,"Information");   
  }
   
  ... ....
}
 编译之后,由DOS命令行进入debug目录,之后敲入:TestCmdLine   aa   bb   cc   dd 
0 0