ansyncselect网络编程中,对话框程序,出现关闭对话框后,程序仍然在任务管理器的“进程”存在,而不在“应用程序”中存在。但把这一段注释掉,则不会出现这种问题。//接收及处理消息
   while(Ret = GetMessage(&msg, NULL, 0, 0)!=0)
   {
      if (Ret == -1)
      {
         TRACE("GetMessage() failed with error %d\n", GetLastError());
         ::ExitThread(0);
      }
      TranslateMessage(&msg);
      DispatchMessage(&msg);
   }
或者改为
while(Ret=::PeekMessage(&msg,NULL,0,0,PM_REMOVE))
也正常。ps:我就不知道这与PeekMessage,GetMessage有什么关系

解决方案 »

  1.   

    GetMessage是在你关闭掉你的应用程序之后,再次用到这个程序进程的时候才向操作系统发送更新消息。但是PeekMessage是在调用函数以后就发送更新消息。我是这样理解的你可以再看看MSDN上面的解释才是真正的区别。
      

  2.   

    就是下面那一段//接收及处理消息 
      while(Ret = GetMessage(&msg, NULL, 0, 0)!=0) 
      { 
          if (Ret == -1) 
          { 
            TRACE("GetMessage() failed with error %d\n", GetLastError()); 
            ::ExitThread(0); 
          } 
          TranslateMessage(&msg); 
          DispatchMessage(&msg); 
      } 
      

  3.   

    我知道两者的区别,但是这和我的问题好像关系不大把。
    PeekMessage与GetMessage ()的区别在于,当调用该函数而无消息时,且设置了PM_NOREMOVE标识,PeekMessage会立即返回一个空值,无设标识则会让步(交出控制权给其它准备好的程序)。而GetMessage ()不会,而是让程序休眠。
      

  4.   

    消息循环没有退出。可以加退出消息。如:while(Ret = GetMessage(&msg, NULL, 0, 0)!=0)
      {
      //    if (Ret == -1)
          if (WM_QUIT == msg.message)
          {
            TRACE("GetMessage() failed with error %d\n", GetLastError());
            ::ExitThread(0);
          }
          TranslateMessage(&msg);
          DispatchMessage(&msg);
      } 
      

  5.   

    while( GetMessage( &msg, NULL, 0, 0 ) )
    {
    TranslateMessage (&msg) ;
    DispatchMessage (&msg) ;
    }这个就可以了,为什么一定要去判断Ret呢?当程序退出时,发送WM_QUIT消息,这是GetMessage返回一个0,消息循环就结束
      

  6.   

    ret为-1时是表示出错。另外这和本问题没关系。不过谢谢关注。