关于GetMessage()与消息队列

有袁人 2015-08-12 06:46:45
1.GetMessage()函数只有在消息队列中有消息时返回,队列中无消息就会一直等,直至下
一个消息出现时才返回。
2.什么时候消息队列中没有消息?
3.

while (TRUE)
{
if (GetMessage (&msg, NULL, 0, 0))
{
if (msg.message == WM_QUIT)
break ;
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
DrawRectangle (hwnd) ; //当窗口显示,没有其他动作时该函数依然执行
}
else
break;
}


请大家帮忙解答一下我的疑惑(如以上2,3中所述)。
...全文
787 25 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
有袁人 2015-09-01
  • 打赏
  • 举报
回复
引用 24 楼 shuo101 的回复:
[quote=引用 23 楼 u013346423 的回复:]
看过书吗? while(1) { ....... } 你能告诉我,什么时候它会停下来? [/quote] 我竟无言以对
木黑神 2015-08-19
  • 打赏
  • 举报
回复
引用 23 楼 u013346423 的回复:
看过书吗? while(1) { ....... } 你能告诉我,什么时候它会停下来?
阿源是少年 2015-08-14
  • 打赏
  • 举报
回复
你在DrawRectangle中多加一个参数UINT DrawRectangle(HWND hWnd, UINT uMsg); 调用时,DrawRectangle(hWnd, msg.message);在DrawRectangle里写文件,把message dump进去,最后你再去查看消息ID
小竹z 2015-08-14
  • 打赏
  • 举报
回复
引用 8 楼 u013346423 的回复:
[quote=引用 3 楼 zgxyz2010 的回复:] 什么时候没消息了,没有消息的时候就没有了哇。我觉得DrawRectangle虽然在请求绘制,但实际窗口会不会绘制又是另一码事,当没有无效区的时候,估计就不会真的执行重绘。
你说的是windows窗口绘制的一些概念。。。 我问的是怎么样才会没消息?假设我不操作鼠标键盘,仅仅是将窗口显示在桌面。如果这算没有消息,那此时DrawRectangle是不能执行的。而事实是,执行了。悖论[/quote] 你是怎么知道DrawRectangle函数执行了?打断点?如果是这种情况,当你从vs切换到窗体或从窗体切换到vs都会触发消息~
有袁人 2015-08-14
  • 打赏
  • 举报
回复
引用 21 楼 pcradio 的回复:
275 WM_TIMER没有计时器它能自己产生timer了?
不知道,估计和我的操作系统、IDE有关。wsang_web 的就成功了。
有袁人 2015-08-14
  • 打赏
  • 举报
回复
引用 21 楼 pcradio 的回复:
275 WM_TIMER没有计时器它能自己产生timer了?
不知道,估计和我的操作系统、IDE有关。wsang_web 的就成功了。
阿源是少年 2015-08-14
  • 打赏
  • 举报
回复
275 WM_TIMER没有计时器它能自己产生timer了?
有袁人 2015-08-14
  • 打赏
  • 举报
回复
引用 16 楼 wsang_web 的回复:
你是的有很多消息吗????在做什么操作的情况下???? 窗口创建之前会产生三条消息,消息码分别是36、129、131,然后是WM_CREATE消息,断定调式出来的。 上面是我跑出来的结果加上我按截屏键。但是有时候会比这多的图案,可能后面还有其他消息,但总总之,它不会无限生成图像,这就说明程序阻塞GetMessage()函数中。
我的有N多275,难道是win7加VS2010的缘故?
有袁人 2015-08-14
  • 打赏
  • 举报
回复
引用 18 楼 pcradio 的回复:
你在DrawRectangle中多加一个参数UINT DrawRectangle(HWND hWnd, UINT uMsg); 调用时,DrawRectangle(hWnd, msg.message);在DrawRectangle里写文件,把message dump进去,最后你再去查看消息ID
消息ID序列: 799 - 49410 - 49214 - 275 - 275 - 275 - 275 - 275 - 275 - 275 - 275 - 275 - 49218 - 49218 - 49219 - 49219 - 49219 - 49219 - 49219 - 49219 - 49219 - 49218 - 275 - 275 - 275 - 275 - 275 - 275 - 275 - 49218 - 275 - 275 - 275 - 275 - 275 - 275 - 275 - 275 - 275 - 275 - 275 - 275 - 275 - 275 - 275 - 275 - 275 - 275 - 275 - 275 - 275 - 275 - 275 - 275 - 275 - 275 - 275 - 275 - 275 后面是N个275,可是我没有设定时器啊。。。前面的消息都查不到什么意思
阿源是少年 2015-08-13
  • 打赏
  • 举报
回复
什么动作都没有,就没消息,还有 if (msg.message == WM_QUIT) break ; 你这句判断是dead code.
wsang_web 2015-08-13
  • 打赏
  • 举报
回复
你是的有很多消息吗????在做什么操作的情况下????

窗口创建之前会产生三条消息,消息码分别是36、129、131,然后是WM_CREATE消息,断定调式出来的。



上面是我跑出来的结果加上我按截屏键。但是有时候会比这多的图案,可能后面还有其他消息,但总总之,它不会无限生成图像,这就说明程序阻塞GetMessage()函数中。
jiqiang01234 2015-08-13
  • 打赏
  • 举报
回复
启动程序后,什么也不干就没消息了。不动鼠标、不动键盘、不启动定时器、不强制重绘...
小竹z 2015-08-13
  • 打赏
  • 举报
回复
什么时候没消息了,没有消息的时候就没有了哇。我觉得DrawRectangle虽然在请求绘制,但实际窗口会不会绘制又是另一码事,当没有无效区的时候,估计就不会真的执行重绘。
有袁人 2015-08-13
  • 打赏
  • 举报
回复
引用 1 楼 mfmfmmf1 的回复:
其实一直有消息的,我以前试过 但有用的消息肯定来自于一些动作,比如鼠标移动
所以,GetMessage的不缺点是刷新频率而不是所谓的无作为
mfmfmmf1 2015-08-13
  • 打赏
  • 举报
回复
其实一直有消息的,我以前试过 但有用的消息肯定来自于一些动作,比如鼠标移动
有袁人 2015-08-13
  • 打赏
  • 举报
回复
引用 14 楼 mayudong1 的回复:
[quote=引用 11 楼 u013346423 的回复:] [quote=引用 9 楼 mayudong1 的回复:] 把 DrawRectangle (hwnd) ; 换成了一个调试输出,测试了一下,没有消息的时候是不会执行的 不知道你的那个 DrawRectangle (hwnd) ; 函数里干了什么
我用的这里的代码:http://www.cnblogs.com/faceang/archive/2010/05/25/1743757.html 不会调试win32程序。。。[/quote] 这篇文章的最后两行 替换后,应用程序产生一个消息(鼠标移动、改变窗体大小等),在窗体内画一个随 机生成的矩形,无消息产生时,窗体无变化。 它的期望不就是没有消息的时候不执行吗 [/quote] 结果时没有消息时,执行了
mayudong1 2015-08-13
  • 打赏
  • 举报
回复
引用 11 楼 u013346423 的回复:
[quote=引用 9 楼 mayudong1 的回复:] 把 DrawRectangle (hwnd) ; 换成了一个调试输出,测试了一下,没有消息的时候是不会执行的 不知道你的那个 DrawRectangle (hwnd) ; 函数里干了什么
我用的这里的代码:http://www.cnblogs.com/faceang/archive/2010/05/25/1743757.html 不会调试win32程序。。。[/quote] 这篇文章的最后两行 替换后,应用程序产生一个消息(鼠标移动、改变窗体大小等),在窗体内画一个随 机生成的矩形,无消息产生时,窗体无变化。 它的期望不就是没有消息的时候不执行吗
有袁人 2015-08-13
  • 打赏
  • 举报
回复
引用 10 楼 pcradio 的回复:
[quote=引用 6 楼 u013346423 的回复:] [quote=引用 4 楼 jiqiang01234 的回复:] 启动程序后,什么也不干就没消息了。不动鼠标、不动键盘、不启动定时器、不强制重绘...
事实是在没有任何操作的情况下,DrawRectangle (hwnd) ;执行了。但不都是说此时应当是停留在GetMessage()中吗?[/quote] 没有消息你还能进了! 你把Spy++打开,勾住你的窗口,然后你什么都不要做,看面板是否有消息刷新,你说没有消息并不代表它真的没消息[/quote] 试过了,没有消息,依然画图
有袁人 2015-08-13
  • 打赏
  • 举报
回复
引用 10 楼 pcradio 的回复:
[quote=引用 6 楼 u013346423 的回复:] [quote=引用 4 楼 jiqiang01234 的回复:] 启动程序后,什么也不干就没消息了。不动鼠标、不动键盘、不启动定时器、不强制重绘...
事实是在没有任何操作的情况下,DrawRectangle (hwnd) ;执行了。但不都是说此时应当是停留在GetMessage()中吗?[/quote] 没有消息你还能进了! 你把Spy++打开,勾住你的窗口,然后你什么都不要做,看面板是否有消息刷新,你说没有消息并不代表它真的没消息[/quote] 那个,不会用Spy++。。。源代码在http://www.cnblogs.com/faceang/archive/2010/05/25/1743757.html,能不能帮我看看。。。我不知道怎么调试win32程序。。。
有袁人 2015-08-13
  • 打赏
  • 举报
回复
引用 9 楼 mayudong1 的回复:
把 DrawRectangle (hwnd) ; 换成了一个调试输出,测试了一下,没有消息的时候是不会执行的 不知道你的那个 DrawRectangle (hwnd) ; 函数里干了什么
我用的这里的代码:http://www.cnblogs.com/faceang/archive/2010/05/25/1743757.html 不会调试win32程序。。。
加载更多回复(5)

16,549

社区成员

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

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

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