看了<<程序员>>2001.7中的<<在Windows中发送消息>>一文后,写了一个小的sdk程序做实验。这是一个有简单的窗口和菜单的程序,我自定义了一个消息:
#define  My_message    10000
然后在一个菜单中定义了发送这个消息的语句:
PostMessage(hwnd ,My_message,0,0);
在窗口函数的switch中可以处理这个消息,就是仅仅弹出一个MessageBox。如果给了hwnd这个参数那么就一切正常,如果使hwnd为NULL,就不会弹出MessageBox,但是文章中说“...窗口句柄HWND是NULL,PostMessage就投递消息到当前正在运行的线程的消息队列中...”,按这样理解窗口函数也应该能收到这个消息啊。但现在没有收到,那么PostMessage的HWND为空时到底把消息投到哪儿去了?

解决方案 »

  1.   

    是在消息队列里啊,不过PostMessage把消息发送了就马上返回,而SendMessage就不是立即返回
      

  2.   

    楼上说的没错:
    PostMessage将消息放到指定窗口的消息队列后立即返回。这种发送方式称为"邮寄"消息。如果消息队列中的邮寄消息缓冲区已满,则该函数返回错误值。
    在下一个消息循环中,由 GetMessage 函数获得这个消息之后,窗口才会处理该消息。因此PostMessage 一般用于发送一些非关键性的消息。楼上同时提到了SendMessage,那么也同时说一下,并比较一下,可能你就可明白了:
    SendMessage和 PostMessage 函数不同,它在发送一条消息给指定窗口时,将等待该消息被处理之后才会返回。当需要知道某个消息的处理结果时,使用该函数发送消息,然后根据其返回值进行处理。如果发送消息的线程和接收消息的线程不是同一个线程,发送消息的线程将阻塞并等待另一个线程的处理结果,然后继续运行;否则,SendMessage 函数将直接调用接收消息窗口的窗口过程函数。也就是说:
    PostMessage只是把消息放入队列,不管其他程序是否处理都继续执行,而SendMessage必须等待其他程序处理消息后才继续执行。这两个函数的返回值也不同,PostMessage的返回值表示PostMessage函数执行是否正确,而SendMessage的返回值表示其他程序处理消息后的返回值。 这类的文章和书很多,可以很方便地找到更详细的资料。---
     by Henry
      

  3.   

    ParametershWnd
    [in] Handle to the window whose window procedure is to receive the message. The following values have special meanings.
    HWND_BROADCAST
    The message is posted to all top-level windows in the system, including disabled or invisible unowned windows, overlapped windows, and pop-up windows. The message is not posted to child windows.
    NULL
    The function behaves like a call to PostThreadMessage with the dwThreadId parameter set to the identifier of the current thread.如果是NULL的话,你的主线程要ON_THREAD_MESSAGE()才收的到啊。
      

  4.   

    我用的是sdk啊,不是mfc,该怎么办啊?
      

  5.   

    发送到消息队列中。
    每个程序都有消息循环,用来从队列中提取消息,通过HWND判断消息是不是发给自己的,是的话就进行处理,不是的就在将他还原到消息队列。
      

  6.   

    我用的是GetMessage来提啊,谁能给一个比较详细的代码?
      

  7.   

    是在消息队列里啊,不过PostMessage把消息发送了就马上返回,而SendMessage就不是立即返回
      

  8.   

    The function behaves like a call to PostThreadMessage with the dwThreadId parameter set to the identifier of the current thread.就是说,发到你调用PostMessage的那个线程的消息队列里了。
    可以在GetMessage后判断msg.hwnd是不是NULL,如果是,就是一个线程消息,msg.hwnd=NULL的消息不会被Dispatch的。
      

  9.   

    如In355Hz(好象一条狗)所说, 你的消息是发出了,但你的WNDPROC收不到.我想你应该在
        while (GetMessage(&msg, NULL, 0, 0)) 
       {
    if(msg.massage==Mymassage)
             {
             .....
             continue;
             }
     
    TranslateMessage(&msg);
    DispatchMessage(&msg);
        }
    处理.
      

  10.   

    这在<windows程序设计〉里面有很详细的讲解