关于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,有什么错么?
求解。谢谢。
hWnd:取得其消息的窗口的句柄。当其值取NULL时,GetMessage为任何属于调用线程的窗口检索消息,线程消息通过PostThreadMessage寄送给调用线程。
窗体隐藏的时候就不会再有后续消息了,也就不会再退出线程。 本帖最后由 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)
santaclaus 发表于 2016-3-27 09:59
1、当GetMessage的hwnd参数不为NULL时,表示从消息队列中获取由hwnd指定的窗体消息,即对消息进行过滤。但 ...
谢谢但是对于多窗口的话怎么处理呢? 仍然可以采用GetMessage(&msg,NULL,...),因为这样将获取所有类型的消息,至于是哪种,可以通过msg.hwnd是否为NULL看出来。如果是窗口消息,DispatchMessage将其分派到由msg.hwnd指定的窗口过程中去。如果是线程范围的消息,特别是PostThreadMessage的消息,因为不与窗口关联,一般要在消息循环中自己处理或将取到的消息msg,然后自己设定msg.hwnd为某个窗口句柄,最后再DispatchMessage到相应的窗口过程中去处理。但是我也遇到取出的消息,其msg.hwnd为NULL,却仍会被分派到某一个窗口过程的情况,这里我估计,可能是有些消息,系统会特殊处理。 楼上是高手 多教教我们 谢谢了 讲解的很好 谢谢你用颜色分开表示 顶顶顶~
页:
[1]