如何在一个线程中给一个窗口发送消息?

解决方案 »

  1.   

    在线程中保存你的窗口句柄,然后在线程中
    hMyWnd->PostMessage(.....);
    或者 ->SendMessage(....);
      

  2.   

    用 SendMessage 还是 PostMessage 要看你消息的用途
    SendMessage 是处理完消息后函数才返回,如果你的消息是要立即做处理的,那么用 SendMessage。
    PostMessage 是将消息放入队列后就立即返回,也就是说该消息会等着被消息循环所处理,不是立即的。两个函数的参数应该都是这样HWND hWnd 消息发送目标窗口句柄
    UINT msg  发送消息(例如 WM_CREATE )
    WPARAM wParam  两个消息参数
    LPARAM lParam具体可查阅 MSDN,CSDN 上就有。
      

  3.   

    写错了,是PostMessage(hMyWnd,...);和SendMessage(hMyWnd,....);
      

  4.   

    参考:
    http://community.csdn.net/Expert/topic/3361/3361969.xml?temp=.1466486
      

  5.   

    nineclock(本人成分:59%的帅,40%的酷,1%的微量羞涩(-'_'-)) ( ) 信誉:105  2004-10-03 18:17:00  得分: 0  
     
     
       写错了,是PostMessage(hMyWnd,...);和SendMessage(hMyWnd,....);
      
     
    你没写错的啦!!你说的是 MFC 中封装的函数,这里 hMyWnd 是 CWnd* 吧,呵呵。 ^_^
      

  6.   

    typedef struct tagMyParam{
    HWND hHost;
    .../*other struct member*/
    }MyParam;DWORD WINAPI MyThreadProc(LPVOID param)
    {
      MyParam* pmp = (MyParam*)param;
      .../*you codeing*/
      SendMessage(pmp->hHost,....);
      ...
    }
    /*主线程内把要使用的窗口句柄赋给结构*/
    MyParam mp;
    mp.hHost = m_hWnd; /*you master window handle*/
    .../*创建线程是把参数传进去*/
    DWORD dwid;
    CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)MyThreadProc,(void*)&mp,0,&dwid);
      

  7.   

    楼主要注意,不同线程之间的数据存储最好存在 Heap 里,或者全局变量也行,也就是说千万不要把楼上的 MyParam mp; 变量声明在函数过程中,这样函数一结束 &mp 该指针指向的数据就会失效。因此你一定要把它放到全局变量或动态分配的内存中(malloc 或 HeapAlloc,其实一样。)。还有,如果你要声明一个线程之间的通讯标志变量,例如 bool bStop 那么最好把它加上 volatile 关键字,这样会防止编译器在优化时把改变量的值存储在寄存器内,引起变量值的过期。
      

  8.   

    CreateThread时将窗口HANDLE传给线程,需要发送消息时执行SendMessage或PostMessage
      

  9.   

    或者用FindWindow得到句柄,然后再SendMessage也可以。
      

  10.   

    用PostMessage或SendMessage
    PostMessage 和SendMessage的区别主要在于是否等待其他程序消息处理。PostMessage只是把消息放入队列,不管其他程序是否处理都返回,然后继续执行;而SendMessage必须等待其他程序处理消息后才返回,继续执行。这两个函数的返回值也不同,PostMessage的返回值表示PostMessage函数执行是否正确,而SendMessage的返回值表示其他程序处理消息后的返回值。
    一般,如果发送消息后,没有其他的操作,用SendMessage.如果还有其他的操作,用PostMessage.