进队消息和不进队消息究竟有什么区别。 WM_UPDATE究竟属于哪种?

aoyihuashao 2010-04-08 11:41:16
看完windows程序设计3.2.2进队消息和不进队消息,感觉很模糊。

书上说,
进队消息是由windows放入程序的消息队列,然后在消息循环中,重新分配给窗口过程。
不进队消息是由windows调用窗口时,直接发送给窗口过程。

字面上是看懂了,但实际上,在一个程序中,会体现出什么区别呢?
比如WM_KEYUP是进队消息,WM_SIZE是不进队消息,个人感觉在程序中没发现两个有什么区别的啊。

还有就是WM_UPDATE,在讲进队消息的时候,说他是进队消息。在讲不进队消息的时候,又说在updatewindow的时候,产生个wm_update,是不进队消息。


...全文
373 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
柚子毛驴 2011-08-25
  • 打赏
  • 举报
回复
学习了。。
diaodiao7 2011-02-21
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 aoyihuashao 的回复:]
引用 12 楼 heiheizh618 的回复:

。。。为什么无关。。
我的回复就是

个人感觉不进队消息优先权比进队消息的大,它不用排队,直接交给窗口过程处理~

这句话的解释啊。。你难道不是看到的都是这句sendMessage都是直接处理的,不进消息队列,优先级大吗?
那为什么直接处理,怎么直接处理?为什么会优先级大?
你连我的回复都没仔细看啊


你的意思是Send……
[/Quote]

可以安装个钩子过程 做个判断 有的消息 用PostMessage编译时没问题 但是 实际上对它用PostMessage的时候是不起作用的
wltg2001 2010-04-08
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 m_tornado 的回复:]
引用 11 楼 aoyihuashao 的回复:
WM_PAINT呢?在什么情况下进队,什么情况下不进队?

需要更新的时候,情况比较多,譬如说:窗口覆盖了,移动了,自己刷新了等等,发的比较多的一个消息
[/Quote]
队列化消息和非队列化消息在应用上区别不是很大,另外,有些消息有可能进入队列,某些情况下不进入队列,对编程者来说,没有必要区分得很清楚,反正都是窗口处理函数处理。
另外,没有WM_UPDATE这个消息,应该是WM_PAINT
m_tornado 2010-04-08
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 aoyihuashao 的回复:]
WM_PAINT呢?在什么情况下进队,什么情况下不进队?
[/Quote]
需要更新的时候,情况比较多,譬如说:窗口覆盖了,移动了,自己刷新了等等,发的比较多的一个消息
heiheizh618 2010-04-08
  • 打赏
  • 举报
回复
。。。为什么无关。。
我的回复就是

个人感觉不进队消息优先权比进队消息的大,它不用排队,直接交给窗口过程处理~

这句话的解释啊。。你难道不是看到的都是这句sendMessage都是直接处理的,不进消息队列,优先级大吗?
那为什么直接处理,怎么直接处理?为什么会优先级大?
你连我的回复都没仔细看啊
aoyihuashao 2010-04-08
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 m_tornado 的回复:]

没有区别么?
刚开机的时候,你看机器没反应,疯狂的右键,一会儿弹出menu,这就是队列消息~
如果不是队列消息,当时没有反应,就那么过去了,事后没有反应~
[/Quote]

WM_PAINT呢?在什么情况下进队,什么情况下不进队?
aoyihuashao 2010-04-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 liang_lq 的回复:]

进队消息基本上是用户的输入:击键的消息(WM_KEYDOWN、WM_KEYUP)、键盘输入产生字符(WM_CHAR)、鼠标移动(WM_MOUSEMOVE)、鼠标键(WM_LBUTTONDOWN)、计时消息(WM_TIMER)、刷新消息(WM_PAINT)和退出消息(WM_QUIT)。
不进队消息则是其他消息,一般情况下,不进队消息的产生是由于调用了其他Windows函数。
另外,两个消息发送……
[/Quote]

[Quote=引用 4 楼 dong918 的回复:]

引用 1 楼 liang_lq 的回复:
进队消息基本上是用户的输入:击键的消息(WM_KEYDOWN、WM_KEYUP)、键盘输入产生字符(WM_CHAR)、鼠标移动(WM_MOUSEMOVE)、鼠标键(WM_LBUTTONDOWN)、计时消息(WM_TIMER)、刷新消息(WM_PAINT)和退出消息(WM_QUIT)。
不进队消息则是其他消息,一般情况下,不进队消息的产生是由于调用了其……
[/Quote]


这些都是书上写的啊,字面上的意思看懂了,一个是通过消息循环发送给窗口,一个是直接发送给窗口。但在实际应用中,有啥区别呢?仅仅是下面这样吗?

[Quote=引用 2 楼 chenweiye120 的回复:]
个人感觉不进队消息优先权比进队消息的大,它不用排队,直接交给窗口过程处理~
[/Quote]
m_tornado 2010-04-08
  • 打赏
  • 举报
回复
没有区别么?
刚开机的时候,你看机器没反应,疯狂的右键,一会儿弹出menu,这就是队列消息~
如果不是队列消息,当时没有反应,就那么过去了,事后没有反应~
aoyihuashao 2010-04-08
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 zyq5945 的回复:]

WM_UPDATE有这个消息吗?没看到MSDN上有说明。
[/Quote]

写错了,WM_PAINT
aoyihuashao 2010-04-08
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 heiheizh618 的回复:]

用SendMessage()发送的消息是消息处理函数直接处理的,而且这个过程中SendMessage()是不会返回的,只有等消息处理函数处理完毕返回值之后SendMessage()才会返回。也就是这个过程中程序是不会执行其他指令的。
PostMessage()是把消息发送到消息队列,然后立即返回。在消息处理函数处理这条消息之前,程序可以执行其他的指令。

SendMessage()可以想象……
[/Quote]

这个,跟本贴无关吧。。。
heiheizh618 2010-04-08
  • 打赏
  • 举报
回复
用SendMessage()发送的消息是消息处理函数直接处理的,而且这个过程中SendMessage()是不会返回的,只有等消息处理函数处理完毕返回值之后SendMessage()才会返回。也就是这个过程中程序是不会执行其他指令的。
PostMessage()是把消息发送到消息队列,然后立即返回。在消息处理函数处理这条消息之前,程序可以执行其他的指令。

SendMessage()可以想象成函数调用
类似于
bool CallFunc()
{
BeCallFunc(); //在这个函数返回之前CallFunc()是不会返回的,自然这个函数下面的、
//外面的指令都无 法执行的
return true;
}

PostMessage()

类似于
void PostMessage()
{
PutMsgInQueue(); //放置消息然后返回,程序执行其他指令
return ;
}

wndProc()
{
GetMessageFromQueue();
}
zyq5945 2010-04-08
  • 打赏
  • 举报
回复
WM_UPDATE有这个消息吗?没看到MSDN上有说明。
dong918 2010-04-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 liang_lq 的回复:]
进队消息基本上是用户的输入:击键的消息(WM_KEYDOWN、WM_KEYUP)、键盘输入产生字符(WM_CHAR)、鼠标移动(WM_MOUSEMOVE)、鼠标键(WM_LBUTTONDOWN)、计时消息(WM_TIMER)、刷新消息(WM_PAINT)和退出消息(WM_QUIT)。
不进队消息则是其他消息,一般情况下,不进队消息的产生是由于调用了其他Windows函数。
另外,两个消息发送函……
[/Quote]

学习了。。。。。。。
zyq5945 2010-04-08
  • 打赏
  • 举报
回复
http://www.moon-soft.com/doc/19154.htm
消息分为队列消息(进入线程的消息队列)和非队列消息(不进入线程的消息队列)。对于队列消息,最常见的是鼠标和键盘触发的消息,例如 WM_MOUSERMOVE,WM_CHAR等消息;还有例如:WM_PAINT、WM_TIMER和WM_QUIT。当鼠标、键盘事件被触发后,相应的鼠标或键盘驱动程序就会把这些事件转换成相应的消息,然后输送到系统消息队列,由Windows系统负责把消息加入到相应线程的消息队列中,于是就有了消息循环(从消息队列中读取并派送消息)。还有一种是非队列消息,他绕过系统队列和消息队列,直接将消息发送到窗口过程。例如,当用户激活一个窗口系统发送 WM_ACTIVATE, WM_SETFOCUS, and WM_SETCURSOR。创建窗口时发送WM_CREATE消息。在后面你将看到,MS这么设计是很有道理的,以及他的整套实现机制。
chenweiye120 2010-04-08
  • 打赏
  • 举报
回复
个人感觉不进队消息优先权比进队消息的大,它不用排队,直接交给窗口过程处理~
liang_lq 2010-04-08
  • 打赏
  • 举报
回复
进队消息基本上是用户的输入:击键的消息(WM_KEYDOWN、WM_KEYUP)、键盘输入产生字符(WM_CHAR)、鼠标移动(WM_MOUSEMOVE)、鼠标键(WM_LBUTTONDOWN)、计时消息(WM_TIMER)、刷新消息(WM_PAINT)和退出消息(WM_QUIT)。
不进队消息则是其他消息,一般情况下,不进队消息的产生是由于调用了其他Windows函数。
另外,两个消息发送函数,SendMessage为发送“不进队消息”,直接调用处理函数处理,并等待返回处理函数处理结果。PostMessage为发送“进队消息”,不等待返回结果
Eleven 2010-04-08
  • 打赏
  • 举报
回复
SendMessage和PostMessage的区别。。。
aoyihuashao 2010-04-08
  • 打赏
  • 举报
回复
OK。
我是苦力 2010-04-08
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 wltg2001 的回复:]
你的意思是SendMessage就是不进队消息?PostMessage就是进队消息?
===========================
是的,SendMessage确实不进队列,而且直接调有窗口处理函数,PostMessage进队列。
上面我已经说了,消息并不是严格地分成两种,而是有两种消息方式,一种进队列,一种不进队列,但是具体到一个消息,比如WM_SIZE,它并不是说一定就不进队列……
[/Quote]
顶这个。
队列和非队列是消息流向的两种方式,而并不是两种类型的消息,搞清楚概念先。
消息进不进队列和具体消息有关系,而是和当前消息的流向方式有关系。你让它进它就进,你不让它进它就不进。不过由于有些消息的具体原因,系统都是用同种方式去操作消息,让人感觉这个消息好像都是队列消息而已。
heiheizh618 2010-04-08
  • 打赏
  • 举报
回复
你用模态对话框和非模态对话框想一想就明白了。
模态对话框类似于SendMessage();
非模态类似于PostMessage();
加载更多回复(3)

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧