在MSDN 中说,可以在一个长时间的循环中加入PeekMessage 语句来检查消息队列,这个这个循环就可以响应用户的输入,可以根据用户的输入来结束循环或操作。我把MSDN 提供的例程中的PeekMessage换成了GetMessage ,达到了一样的效果。可是MSDN 中又说,GetMessage 如果在队列中抓不到消息,那么系统会暂时将线程挂起,系统会去照顾其他程序。可是在我的程序中,循环并没有中断。可是,当我在GetMessage 后面,加上了 DispatchMessage 之后,循环就中断了,只有当有消息输入的时候,循环才会运行。这让我很迷惑,请高手指点一下。

解决方案 »

  1.   

    两个函数主要有以下两个区别: 
        1.GetMessage将等到有合适的消息时才返回,而PeekMessage只是撇一下消息队列。 
        2.GetMessage会将消息从队列中删除,而PeekMessage可以设置最后一个参数wRemoveMsg来决定是否将消息保留在队列中。 
      

  2.   

    SendMessage等消息被处理之后函数才返回;
    PostMessage就不等了,发了就回,管你处不处里呢
    你单独用GetMessage的一样,用了DispatchMessage 就是把消息给目标窗口处理,没处理就不会返回
    http://msdn.microsoft.com/msdnmag/issues/1200/c/
      

  3.   

    PeekMessage和GetMessage 的异同:
    同:它们都是到消息队列中中抓消息,如果抓不到,程序的主程线程(Primary thread,是一个UI执行线程)会被操作系统挂起,当操作系统两次回来照顾这一执行线程时,发现消息队列仍然是空的,这时候两个API函数行为就有不同了!
    异:GetMessage 会过门不入,于是操作系统再去照顾其它人
       PeekMessage会取回控制权使程序得以执行一段时间.
      

  4.   

    http://dev.csdn.net/develop/article/15/15000.shtm
      

  5.   

    GETMESSAGE()如果消息队列为空会等待,而PEEKMESSAGE()会返回
    PEEKMESSAGE()可以从消息队列中提取消息,而且可以选择是否删除等操作。
      

  6.   

    SendMessage等消息被处理之后函数才返回;
    PostMessage就不等了,发了就回,把消息放在消息队列中
      

  7.   

    和 SendMessage/PostMessage的区别 差不多
      

  8.   

    Unlike the GetMessage function, the PeekMessage function does not wait for a message to be placed in the queue before returning.
      

  9.   

    (可是在我的程序中,循环并没有中断。)看看lpMsg的内容,是不是收到了消息。
      

  10.   

    GetMessage没有捕捉到合适的消息不会返回
    PeekMessage把需要的捕捉的消息队列丢下,然后可以转到别处,只是没有有消息到达需要到这个队列中去判断是否捕捉。
    而你用了DispatchMessage就是把该消息交给窗口过程去处理,一般这样的消息都有窗口有关系,比如窗口移动,改变大小等等,一样,也是等待消息到达