﻿<?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++博客-极品垃圾-文章分类-windows api</title><link>http://www.cppblog.com/bestcln/category/10836.html</link><description>初学VC ,就是把每天所看到的整理到博客，慢慢消化这些内容。见证我的学习之路吧。很多都是转载。</description><language>zh-cn</language><lastBuildDate>Tue, 09 Jun 2009 03:11:16 GMT</lastBuildDate><pubDate>Tue, 09 Jun 2009 03:11:16 GMT</pubDate><ttl>60</ttl><item><title>windows消息机制 (2)</title><link>http://www.cppblog.com/bestcln/articles/87138.html</link><dc:creator>极品垃圾</dc:creator><author>极品垃圾</author><pubDate>Tue, 09 Jun 2009 01:20:00 GMT</pubDate><guid>http://www.cppblog.com/bestcln/articles/87138.html</guid><wfw:comment>http://www.cppblog.com/bestcln/comments/87138.html</wfw:comment><comments>http://www.cppblog.com/bestcln/articles/87138.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/bestcln/comments/commentRss/87138.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/bestcln/services/trackbacks/87138.html</trackback:ping><description><![CDATA[<p>一 Windows中有一个系统消息队列，对于每一个正在执行的Windows应用程序,系统为其建立一个&#8220;消息队列&#8221;，即应用程序队列，用来存放该程序可能创建的各种窗口的消息。应用程序中含有一段称作&#8220;消息循环&#8221;的代码，用来从消息队列中检索这些消息并把它们分发到相应的窗口函数中。</p>
<p><img height=211 alt=o_windowsmessage2.jpg src="http://www.cppblog.com/images/cppblog_com/mzty/2021/o_windowsmessage2.jpg" width=450 border=0> <br><br>二 Windows为当前执行的每个Windows程序维护一个「消息队列」。在发生输入事件之后，Windows将事件转换为一个「消息」并将消息放入程序的消息队列中。程序通过执行一块称之为「消息循环」的程序代码从消息队列中取出消息：<br>while(GetMessage (&amp;msg, NULL, 0, 0))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp; TranslateMessage (&amp;msg) ;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp; DispatchMessage (&amp;msg) ;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>}</p>
<p>msg变量是型态为MSG的结构，型态MSG在WINUSER.H中定义如下：<br>typedef struct tagMSG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; HWND&nbsp;&nbsp; hwnd ;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp; UINT&nbsp;&nbsp; message ;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp; WPARAM wParam ;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp; LPARAM lParam ;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp; DWORD&nbsp; time ;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp; POINT&nbsp; pt ;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>MSG, * PMSG ;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>POINT数据型态也是一个结构，它在WINDEF.H中定义如下：<br>typedef struct tagPOINT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; LONG&nbsp; x ;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; LONG&nbsp; y ;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>POINT, * PPOINT;<br>TranslateMessage(&amp;msg);&nbsp;将msg结构传给Windows，进行一些键盘转换。（关于这一点，我们将在第六章中深入讨论。）<br>DispatchMessage(&amp;msg);又将msg结构回传给Windows。然后，Windows将该消息发送给适当的窗口消息处理程序，让它进行处理。这也就是说，Windows将呼叫窗口消息处理程序。在HELLOWIN中，这个窗口消息处理程序就是WndProc函数。处理完消息之后，WndProc传回到Windows。此时，Windows还停留在DispatchMessage呼叫中。在结束DispatchMessage呼叫的处理之后，Windows回到HELLOWIN程序中，并且接着从下一个GetMessage呼叫开始消息循环。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>三 队列化消息与非队列化消息<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>消息能够被分为「队列化的」和「非队列化的」。队列化的消息是由Windows放入程序消息队列中的。在程序的消息循环中，重新传回并分配给窗口消息处理程序。非队列化的消息在Windows呼叫窗口时直接送给窗口消息处理程序。也就是说，队列化的消息被「发送」给消息队列，而非队列化的消息则「发送」给窗口消息处理程序。任何情况下，窗口消息处理程序都将获得窗口所有的消息--包括队列化的和非队列化的。窗口消息处理程序是窗口的「消息中心」。</p>
<p>队列化消息基本上是使用者输入的结果，以击键（如WM_KEYDOWN和WM_KEYUP消息）、击键产生的字符（WM_CHAR）、鼠标移动（WM_MOUSEMOVE）和鼠标按钮（WM_LBUTTONDOWN）的形式给出。队列化消息还包含时钟消息（WM_TIMER）、更新消息（WM_PAINT）和退出消息（WM_QUIT）。</p>
<p>非队列化消息则是其它消息。在许多情况下，非队列化消息来自呼叫特定的Windows函数。例如，当WinMain呼叫CreateWindow时，Windows将建立窗口并在处理中给窗口消息处理程序发送一个WM_CREATE消息。当WinMain呼叫ShowWindow时，Windows将给窗口消息处理程序发送WM_SIZE和WM_SHOWWINDOW消息。当WinMain呼叫UpdateWindow时，Windows将给窗口消息处理程序发送WM_PAINT消息。键盘或鼠标输入时发出的队列化消息信号，也能在非队列化消息中出现。例如，用键盘或鼠标选择了一个菜单项时，键盘或鼠标消息就是队列化的，而说明菜单项已选中的WM_COMMAND消息则可能就是非队列化的。</p>
<p>四 SendMessage()与PostMessage()之间的区别是什么？<br>它们两者是用于向应用程序发送消息的。PostMessagex()将消息直接加入到应用程序的消息队列中，不等程序返回就退出；而SendMessage()则刚好相反，应用程序处理完此消息后，它才返回。我想下图能够比较好的体现这两个函数的关系：<br><br><img height=407 alt=o_postmessage.gif src="http://www.cppblog.com/images/cppblog_com/mzty/2021/o_postmessage.gif" width=609 border=0></p>
<p><br>五 函数peekmessage和getmessage的区别？</p>
<p>两个函数主要有以下两个区别:<br>1.GetMessage将等到有合适的消息时才返回,而PeekMessage只是撇一下消息队列。<br>2.GetMessage会将消息从队列中删除,而PeekMessage可以设置最后一个参数wRemoveMsg来决定是否将消息保留在队列</p>
<img src ="http://www.cppblog.com/bestcln/aggbug/87138.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/bestcln/" target="_blank">极品垃圾</a> 2009-06-09 09:20 <a href="http://www.cppblog.com/bestcln/articles/87138.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>