东梨子 发表于 2016-3-26 22:40:36

关于GetMessage第二参数问题

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

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

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

GetMessage敲成这样

      ShowWindow(hwnd, nCmdShow);
      UpdateWindow(hwnd);
      MSG msg;
      while (GetMessage(&msg, hwnd, 0, 0))
      {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
      }

      return msg.wParam;
而原来的小甲鱼的正确代码是

      while (GetMessage(&msg, NULL, 0, 0))



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

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

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

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

求解。谢谢。

freeparty 发表于 2016-3-27 00:18:18

hWnd:取得其消息的窗口的句柄。当其值取NULL时,GetMessage为任何属于调用线程的窗口检索消息,线程消息通过PostThreadMessage寄送给调用线程。

窗体隐藏的时候就不会再有后续消息了,也就不会再退出线程。

santaclaus 发表于 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)

东梨子 发表于 2016-3-27 12:01:11

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

谢谢但是对于多窗口的话怎么处理呢?

santaclaus 发表于 2016-3-27 14:22:51

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

pinik 发表于 2016-6-9 13:33:24

楼上是高手 多教教我们 谢谢了 讲解的很好 谢谢你用颜色分开表示

ONLY123 发表于 2016-6-15 20:04:53

顶顶顶~
页: [1]
查看完整版本: 关于GetMessage第二参数问题