社区
C语言
帖子详情
Dispatchmessage()函数是干什么?
eyetiger
2002-04-23 10:14:02
书上说Dispatchmessage()函数将消息传送到指定窗口函数,它是调用wndproc函数,还是向windows发消息,由windows来调用wndprog呢?
当一个窗口有消息时,windows把消息发给这个窗口?也就是说调用wndproc函数,那为什么还要消息循环?
...全文
4793
18
打赏
收藏
Dispatchmessage()函数是干什么?
书上说Dispatchmessage()函数将消息传送到指定窗口函数,它是调用wndproc函数,还是向windows发消息,由windows来调用wndprog呢? 当一个窗口有消息时,windows把消息发给这个窗口?也就是说调用wndproc函数,那为什么还要消息循环?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
18 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
eyetiger
2002-04-28
打赏
举报
回复
谢谢大家!
现在明白多了
DaNiao
2002-04-27
打赏
举报
回复
windows在进程的消息队列中有消息的时候会提高进程的优先级(不是你设置的那个,而是windows在调度的时候优先考虑你),在无消息的时候会降低你进程的优先级(前面说不会分配时间片,说得太绝对了点)
当然,在GetMessage()的时候来判断也是一种选择,但MS认为放在DispatchMessage里效率会更高一些
DaNiao
2002-04-27
打赏
举报
回复
DispatchMessage到底干了些什么,现在主要还是以道听途说为主
更详细的东西还是不太清楚,也许要等MS公开windows源码以后才能搞明白
DaNiao
2002-04-27
打赏
举报
回复
其实问题的关键在于DispatchMessage到底干了什么
如果只是去调用相应的窗口,那自己写个switch不就可以了
DispatchMessage与switch不同之处在于DispatchMessage会
先调用windows,进入管态(大概是range 0),然后再由windows调用
窗口的函数。
为什么这么麻烦?
因为这样windows就可以知道你的程序运行到什么情况了,
windows来调用你的窗口,这样你的窗口返回的时候windows就知道
你已经处理过一个消息了,如果没有新的消息进入消息队列
windows就不再会给你的进程分配时间片
如果是你自己写switch的话,windows就不可能这样灵活的分配时间
资源利用率就会降低
那么还要消息循环干什么,windows直接把消息发给窗口不就可以了吗?
因为你要在消息循环里把KEY_DOWN和KEY_UP组合成WM_CHAR,
还可以直接屏蔽掉许多对你来说无用的消息,加快速度
DispatchMessage这一套机制大概是windows里最难理解的部分了(除了COM以外)
blactte
2002-04-27
打赏
举报
回复
windows消息处理机制是这样的:
首先系统(也就是windows)把来自硬件(鼠标,键盘等消息)和来自应用程序的消息
放到一个系统消息队列中去.
而应用程序需要有自己的消息队列,也就是线程消息队列,没一个线程有自己的消息队列,对于多线程的应用程序就有和线程数目相等的线程消息队列.
winsows消息队列把得到的消息发送到线程消息队列,
线程消息队列每次取出一条消息发送到指定窗口,不断循环直到程序退出.这个循环就是靠消息环(while(GetMessage()) TranslateMessage();DispatchMessage(); 实现的.GetMessage()只是从线程消息中取出一条消息,而DispatchMessage
则把取出的消息发送到目的窗口.如果收到WM_CLOSE消息则结束循环,发送postqiutmessage(0),处理WM_DESTROY销毁窗口!
明白了吗?
freelybird
2002-04-27
打赏
举报
回复
简单一句话: DispatchMessage(&Msg)作用就是根据msg的内容调用WndProc
mldnking
2002-04-26
打赏
举报
回复
DispatchMessage(&Msg)
将消息传给在Msg结构中为窗口所制定的消息处理器
delphihero
2002-04-26
打赏
举报
回复
你用 DispatchMessage()把消息交给消息的窗体,而wndproc这个消息函数是由系统调用来处理你的窗体消息的,并不是你主动调用的。当然你也可以在GetMessage()循环里处理来,但这样很不规范,应为windows是多任务处理系统,所以你的函数应该由操作系统统一调用
HardLoveC
2002-04-23
打赏
举报
回复
callback是因为不仅是用户操作需要用到WndProc()函数,系统有时候也会调用你写的WndProc()函数。
cBeginner
2002-04-23
打赏
举报
回复
我喜欢这种关于API的讨论,尤其可以帮助一些win32 programming初学者,可惜这里关于讨论API的太少了,我正在看<<Windows 程序设计>>。
cBeginner
2002-04-23
打赏
举报
回复
max_welcome(愤怒的小马) 说道没错,我也是那么理解的。
callback函数的具体定义在<<Windows 程序设计>>里的第3章里好象有说,可以翻翻看。
max_welcome
2002-04-23
打赏
举报
回复
windows首先将消息存入系统堆栈,然后再放入应用程序的堆栈。
而应用程序一般有很多窗口,有不同的窗口过程,dispatch()函数就是将消息发送给不同的窗口过程函数
eyetiger
2002-04-23
打赏
举报
回复
我好像在哪看到过只有windows调用的函数才是callback呀?
eyetiger
2002-04-23
打赏
举报
回复
cBeginner(),neptunez();
windows是不是只把消息放在应用程序的message queue里面,没有发给具体的窗口
窗口利用自己的消息循环,来得到消息,然后调用wndproc处理
这样的话,wndproc不是可以用一个普通的成员函数替代,为什么要是
callback呢?
cBeginner
2002-04-23
打赏
举报
回复
帖主问的是DispatchMessage()。
neptunez
2002-04-23
打赏
举报
回复
你用鼠标点击窗口,鼠标移动等等等message,windows放到message queue里面。你的message loop是从queue上一个一个地把message取出来,用的事GetMessage()这个函数。DispatchMessage(&msg)把你的message传给wndproc这个函数并且运行这个函数。
cBeginner
2002-04-23
打赏
举报
回复
先向应用程序发消息,当应用程序接到消息后,然后它会把消息通过DispatchMessage(&msg)传递给窗口函数wndproc,窗口函数就会对照事先由程序编写好的消息对照表调用对应的方法来处理消息。
那为什么还要消息循环?是因为当用户在应用一个程序的时候会有不同的(多次)操作,比如按一个按钮,移动窗口,改变窗口大小,等等。如果没有消息循环的话,就只能接收一条(一次)消息,这是错误的。
eyetiger
2002-04-23
打赏
举报
回复
为什么没人帮我呀?
C window消息窗口
NULL 博文链接:https://hudeyong926.iteye.com/blog/1541533
vc6实现的目录监视小工具很实用
vc6实现的目录监视小工具很实用 用来分析软件执行中干了什么 很实用 完整工程
Dispatch
Message
函数
干了啥?
Dispatch
Message
函数
主要分发一个消息给窗口处理
函数
。具体实现代码如下: #001 LRESULT WINAPI #002
Dispatch
Message
W(CONST MSG *lpmsg) #003 { #004 LRESULT Ret = 0; #005 PWINDOW Wnd; #006 检查是否有窗口,如果有窗口,再判断窗口是否
【重学C/C++】
Dispatch
Message
||Translate
Message
||PostThread
Message
||Peek
Message
Windows API一日一练(14)
Dispatch
Message
函数
(牛人的网站!) 前面已经介绍从系统队列里获取一条消息,然后经过快捷键的
函数
检查,又通过字符消息
函数
的转换,最后要做的事情就是调用
Dispatch
Message
函数
,它的意思就是说要把这条消
Dispatch
Message
到底干了什么
转自csdn一网友的顶贴 ==========================
Dispatch
Message
到底干了什么 如果只是去调用相应的窗口,那自己写个switch不就可以了
Dispatch
Message
与switch不同之处在于
Dispatch
Message
会 先调用windows,进入管态(大概是range 0),然后再由wind...
C语言
70,036
社区成员
243,246
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章