最近正在研究delphi消息处理机制,有一点不明白:比如说,我在程序窗体上单击一下鼠标,此时产生一个单击的消息,这个消息是放到系统的消息队列中,还是放在程序自己的消息队列中呢?鼠标的驱动程序将消息放到消息队列中的吗?另外:windows 在处理系统队列中的一条消息(例如窗体重画)时,是发送到程序的消息队列中,然后再由程序的消息循环机制从自己的队列中检索消息,处理消息吗?哪位大虾,能用自己的话把上述从开始单击到消息处理的来龙去脉给我讲清楚,以前也问过类似问题,不少仁兄^C and ^V ,回答的似是而非,一直没弄明白。

解决方案 »

  1.   

    实在不明白你的基础知识是如何学习的,你的意思就是Delphi写出来的窗口程序和Windows窗口程序是不同的了?
    告诉你的答案就是不管用什么开发工具只要是写基于Windows的窗口程序,那么所有的一系列消息队列什么的全部都是有Windows来维护,而不是靠开发工具来维护,你看到的代码(Delphi中的消息队列维护代码,其实最后都是交给Windows自己去维护)。不知道你看了这些答案搞懂了没有?
      

  2.   

    Linux2001:我当然知道delphi写出的窗体和windows窗体一样了。 
              “所有的一系列消息队列什么的全部都是有Windows来维护”。
               我相知道的是怎样维护啊。
      

  3.   

    Windows uses the window handle passed with the PostMessage function to determine which thread message queue should receive the message......
    FROM win32 developer's references
    我明白了,哈哈。
      

  4.   

    哑哑哑哑,我给你阐述一边吧:当我们单击鼠标的时候,鼠标的驱动程序负责将鼠标的这个单击动作转换为消息,然后这个消息被发送到了Windows的消息队列,具体是由谁将这个消息发送到系统队列的,我认为应该是鼠标驱动。在系统队列中的这个鼠标单击消息(我们暂时成它为MCM),在系统队列中被排队到某个位置,然后系统消息队列中的消息会一个接一个的被取出,在取出的同时可能会有新的消息被发送到系统消息队列中并被排队。当轮到MCM时,Windows负责将这个消息发送到指定的窗口,具体的窗口应该在MCM这个消息的结构中进行了指定,所以Windows知道需要把这个消息发送到什么地方!然后这个消息被发送到了进程消息队列,也同样进行了排队,最后由进程的窗口过程负责将消息队列中的消息取出进行处理!这里存在一个问题,就是当窗口过程取出这个消息后是如何最终调用到我们在事件中书写的功能代码的呢?呵呵,内容比较多,而且我现在也记不清了,你可以去看看《Delphi高手突破》这个书,里面对最后这个过程的流程有比较清晰的解说....所以说,一个动作的产生到最后调用响应这个动作的一些列其他工作(包括系统默认工作和程序编写者自己在事件中指定的功能)是一个严密的过程。当然你也可以跳过Windows消息队列而将消息直接发送到进程的消息队列中去,哑哑,用PostMessage还是SendMessage不用我说了吧(呵呵,我也忘记了!!!!)......,就这么多吧,不同的需求需要你对这整个过程的理解深度也不同,我平常很少直接拦截消息,所以也就大概知道个过程,具体里面的细节可以看看MSDN或Delphi的SDK帮助,很详细哦!呵呵......
      

  5.   

    最近正在研究delphi消息处理机制,有一点不明白:比如说,我在程序窗体上单击一下鼠标,此时产生一个单击的消息,这个消息是放到系统的消息队列中,还是放在程序自己的消息队列中呢?
    答由驱动程序先放在系统的消息队列,然后由程序从消息队列读然后在把消息经过转换,还要发给WINDOWS,然后有WINDOWS把消息发到指定的的窗口。然后窗口的窗口函数把消息可以处理也可以把消息再DISPATCH给指定的消息处理函数