请问在在工作线程中建立消息循环要用到PeekMessage(),然后再在循环体中调用GetMessage()处理用到的消息。PeekMessage它的最后一个参数是用PM_NOREMOVE还是PM_REMOVE呢?有什么区别?UINT ThreadFunc(LPVOID lParam)
{
   ...
   PeekMessage(&msg,NULL,WM_USER,WM_USER,PM_REMOVE);      //建立消息循环
    while (TRUE)
   {
      if(GetMessage(&msg,NULL,0,0))
      {
         switch(msg.message)
         {
            ...
         }
      }
    }   return 0;
}

解决方案 »

  1.   

    建立消息队列(你不应该叫循环)用哪个都无所谓,因为没有消息在里面,所以即使选择PM_REMOVE也跟PM_NOREMOVE效果一样。
    你这段代码不需要使用PeekMessage这个语句,因为后面马上就是消息循环体,也会帮你建立消息队列。
    只有一种情况需要使用PeekMessage来建立消息队列,那就是Peek之后会有一段时间执行某项工作,然后才正式消息循环,但是消息循环之前可能会有别的线程向你的线程发送消息过来,此时就要预先建立消息队列。
      

  2.   

    你PeekMessage了, 还GetMessage干吗? 这两个函数功能类似, 在不需要响应客户界面的线程中用GetMessage就可以了,它们有以下两个区别: 
    1. GetMessage将等到有合适的消息时才返回, 而PeekMessage只是撇一下消息队列。 
    2. GetMessage会将消息从队列中删除, 而PeekMessage可以设置最后一个参数wRemoveMsg来决定是否将消息保留在队列中, PM_NOREMOVE为保留, PM_REMOVE为不保留。
      

  3.   

    也就是说GetMessage也可以在工作线程中建立消息队列了,和PeekMessage一样?
      

  4.   

    消息队列不用建立的, 每个线程都有自己的消息队列.. 只是说你可以用GetMessage或者PeekMessage函数来取消息
      

  5.   

    3楼理解正确,GetMessage也可以强制建立消息队列
      

  6.   

    呵呵,应该说每个UI线程都有自己的消息队列,而包括非UI线程在内的所有线程一旦调用了与GDI相关的函数或检查消息队列时,系统就会为线程建立消息队列。如:CreateWindow,GetMessage,PeekMessage等。