建立了一个新线程,在线程里建立了窗口,而且配上了消息处理函数,线程函数是这样的{
    mycreatewindows();//建立一个窗口,并且给他绑定窗口的消息处理函数
    MSG msg;   while(Getmessage(&msg,NULL,0,0)) 
   {
     //这里面的两个函数忘了怎么写的,就是从主消息循环里拷贝过来的,一个是用来转换键盘消息,一个是把消息传递给消息处理函数
       
   }
}////////////////////////////////////
//线程的消息处理函数
{
    switch(wMsg)
{
case ...
....
}
}//////////////////////////////////////
我在主线程用postthreadmessage 一个消息 已知在上面线程的while循环 可以正常接收到,但是无法传递给线程的消息处理函数,就是说while里面的那两个函数并没有把消息给自定义的线程消息处理函数.
请达人指点迷津

解决方案 »

  1.   

    TranslateMessage(&msg);
    DispatchMessage(&msg);PostThreadMessage不是发给某个窗口的消息,是发给线程的,需要自己在消息循环中判断处理。
      

  2.   

    如果要发给窗口,应该用PostMessage,给出窗口句柄。你也可以在GetMessage之后,把msg.hwnd赋值为目标窗口。
      

  3.   

    回1楼,while循环就是在线程中自己建立的 完全可以接收,我现在试下你2楼说的发送到窗口,当时没想到
      

  4.   

    用postmessage直接发送给线程窗口好像不行,用单步调试 发送是成功的,但是无法断点到线程,貌似post完就停了,按F10也不动,我还是用postthreadmessage 然后在线程的while循环里加上判断,{ 
        mycreatewindows();//建立一个窗口,并且给他绑定窗口的消息处理函数 
        MSG msg;   while(Getmessage(&msg,NULL,0,0)) 
      { 
          switch(msg.message)
            {
             case TM_START:
                    //在这里如果用postmessage 的话 就会被在这里的while再接收遍。g_hThreadhWnd是线程窗口的句柄
                  ::SendMessage(g_hThreadhWnd,msg.message,NULL,NULL);
                  break;
             default:
                  break; 
            }
           //下面的我注释掉了 程序可以正常运行,貌似从头到尾这两个函数就没用。
          TranslateMessage(&msg); 
          DispatchMessage(&msg); 
        
      } 

    我没在主线程里用sendmessage是怕影响主线程运行。为什么
    TranslateMessage(&msg); 
    DispatchMessage(&msg); 
        
    这两个函数不工作?有人能给我讲下DispatchMessage(&msg);的大体实现么?他是怎么判断把消息交给哪个窗口呢?是当前线程的窗口么?