鱼C论坛

 找回密码
 立即注册
查看: 2746|回复: 6

关于GetMessage第二参数问题

[复制链接]
发表于 2016-3-26 22:40:36 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 东梨子 于 2016-3-26 23:09 编辑

最近学Win程序设计 发现一点小小的问题

在按照小甲鱼的要求打5遍代码的时候

GetMessage敲成这样

  1.         ShowWindow(hwnd, nCmdShow);
  2.         UpdateWindow(hwnd);
  3.         MSG msg;
  4.         while (GetMessage(&msg, hwnd, 0, 0))
  5.         {
  6.                 TranslateMessage(&msg);
  7.                 DispatchMessage(&msg);
  8.         }

  9.         return msg.wParam;
复制代码

而原来的小甲鱼的正确代码是

  1.         while (GetMessage(&msg, NULL, 0, 0))
复制代码




开始运行之后,两者前期运行一样

但是在退出程序的时候,出现了错误:

退出时窗口过程成功发出了PostQuitMessage函数,但是窗口循环并没有退出,只是把窗体给隐藏了,这是为什么呢?

看过GetMessage,但是传入的hwnd不就是窗口的hwnd,有什么错么?

求解。谢谢。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-3-27 00:18:18 | 显示全部楼层
hWnd:取得其消息的窗口的句柄。当其值取NULL时,GetMessage为任何属于调用线程的窗口检索消息,线程消息通过PostThreadMessage寄送给调用线程。

窗体隐藏的时候就不会再有后续消息了,也就不会再退出线程。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-3-27 09:59:14 | 显示全部楼层
本帖最后由 santaclaus 于 2016-3-27 10:24 编辑

1、当GetMessage的hwnd参数不为NULL时,表示从消息队列中获取由hwnd指定的窗体消息,即对消息进行过滤。但很不幸,队列中就有很多消息不属于任何特定的窗口,而只属于线程本身如WM_QUIT消息、通过PostThreadMessage之类的消息,很容易证明,因为GetMessage得到的该类消息,其hwnd为NULL,说明其不属于任何特定的窗口)。
2、换句话讲,消息队列中有的消息属于窗口(hwnd不为NULL),有的是属于线程的(hwnd为NULL,如WM_QUIT),而你想获取的恰恰是那部分属窗口的消息当然就获取不到WM_QUIT消息。只有给GetMessage的hwnd传为NULL,才会获取的所有的消息(包括WM_QUIT)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-3-27 12:01:11 | 显示全部楼层
santaclaus 发表于 2016-3-27 09:59
1、当GetMessage的hwnd参数不为NULL时,表示从消息队列中获取由hwnd指定的窗体消息,即对消息进行过滤。但 ...

谢谢  但是对于多窗口的话怎么处理呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-3-27 14:22:51 | 显示全部楼层
仍然可以采用GetMessage(&msg,NULL,...),因为这样将获取所有类型的消息,至于是哪种,可以通过msg.hwnd是否为NULL看出来。如果是窗口消息,DispatchMessage将其分派到由msg.hwnd指定的窗口过程中去。如果是线程范围的消息,特别是PostThreadMessage的消息,因为不与窗口关联,一般要在消息循环中自己处理或将取到的消息msg,然后自己设定msg.hwnd为某个窗口句柄,最后再DispatchMessage到相应的窗口过程中去处理。但是我也遇到取出的消息,其msg.hwnd为NULL,却仍会被分派到某一个窗口过程的情况,这里我估计,可能是有些消息,系统会特殊处理。

评分

参与人数 1荣誉 +3 鱼币 +3 贡献 +3 收起 理由
东梨子 + 3 + 3 + 3 谢谢!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-6-9 13:33:24 | 显示全部楼层
楼上是高手 多教教我们 谢谢了 讲解的很好 谢谢你用颜色分开表示
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-6-15 20:04:53 | 显示全部楼层
顶顶顶~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-20 13:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表