﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-snail-文章分类-有关windows程序设计</title><link>http://www.cppblog.com/snail/category/10348.html</link><description /><language>zh-cn</language><lastBuildDate>Mon, 27 Apr 2009 18:14:27 GMT</lastBuildDate><pubDate>Mon, 27 Apr 2009 18:14:27 GMT</pubDate><ttl>60</ttl><item><title> Windows的消息机制</title><link>http://www.cppblog.com/snail/articles/81071.html</link><dc:creator>walking snail</dc:creator><author>walking snail</author><pubDate>Sat, 25 Apr 2009 13:29:00 GMT</pubDate><guid>http://www.cppblog.com/snail/articles/81071.html</guid><wfw:comment>http://www.cppblog.com/snail/comments/81071.html</wfw:comment><comments>http://www.cppblog.com/snail/articles/81071.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/snail/comments/commentRss/81071.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/snail/services/trackbacks/81071.html</trackback:ping><description><![CDATA[1 、Windows是一个消息（Message）驱动系统。Windows的消息提供了应用程序之间、应用程序与Windows系统之间进行通信的手段。应用程序想要实现的功能由消息来触发，并且靠对消息的响应和处理来完成。<br>&nbsp;&nbsp;&nbsp; Windows系统中有两种消息队列：系统消息队列和应用程序消息队列。计算机的所有输入设备由Windows监控。当一个事件发生时，Windows先将输入的消息放入系统消息队列中，再将消息拷贝到相应的应用程序消息队列中。应用程序的消息处理程序将反复检测消息队列，并把检测到的每个消息发送到相应的窗口函数中。这便是一个事件从发生至到达窗口函数必须经历的过程。<br>&nbsp;&nbsp; 必须注意的是，消息并非是抢占性的，无论事件的缓急，总是按照到达的先后派对，依次处理（一些系统消息除外），这样可能使一些实时外部事件得不到及时处理。
<br><br>2、Windows中的消息是放在对应的进程的消息队列里的。可以通过GetMessage取得，并且对于一般的消息，此函数返回非零值，但是对于WM_QUIT消息，返回零。可以通过这个特征，结束程序。当取得消息之后，应该先转换消息，再分发消息。所谓转换，就是对键盘码的转换，所谓分发，就是把消息分发给对应的窗口，由对应的窗口处理消息，这样对应窗体的消息处理函数就会被调用。两个函数可以实现这两个功能：<br>&nbsp;&nbsp;&nbsp; TranslateMessage和DispatchMessage。<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; 另外，需要注意，当我们点击窗口的关闭按钮关闭窗口时，程序并没有自动退出，而是向程序发送了一个WM_DESTROY消息（其实过程是这样的，首先向程序发送WM_CLOSE消息，默认的处理程序是调用DestroyWindow销毁窗体，从而引发WM_DESTROY消息），此时在窗体中我们要响应这个消息，如果需要退出程序，那么就要向程序发送WM_QUIT消息(通过PostQuitMessage实现)。一个窗体如果想要调用自己的消息处理函数，可以使用SendMessage向自己发消息。<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; 如上所述，大部分（注意是大部分）的消息是这样传递的：首先放到进程的消息队列中，之后由GetMessage取出，转换后，分发给对应的窗口。这种消息成为存储式消息。存储式消息基本上是使用者输入的结果，以击键（如WM_KEYDOWN和WM_KEYUP讯息）、击键产生的字符（WM_CHAR）、鼠标移动（WM_MOUSEMOVE）和鼠标按钮（WM_LBUTTONDOWN）的形式给出。存储式消息还包含时钟消息（WM_TIMER）、更新消息（WM_PAINT）和退出消息（WM_QUIT）。但是也有的消息是直接发送给窗口的，它们被称为非存储式消息。例如，当WinMain调用CreateWindow时，Windows将建立窗口并在处理中给窗口消息处理函数发送一个WM_CREATE消息。当WinMain调用ShowWindow时，Windows将给窗口消息处理函数发送WM_SIZE和WM_SHOWWINDOW消息。当WinMain调用UpdateWindow时，Windows将给窗口消息处理函数发送WM_PAINT消息。
<br> <img src ="http://www.cppblog.com/snail/aggbug/81071.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/snail/" target="_blank">walking snail</a> 2009-04-25 21:29 <a href="http://www.cppblog.com/snail/articles/81071.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>