关于win32编程中消息循环跟WndProc()窗口过程函数那些事?
关于win32编程中消息循环和WndProc()窗口过程函数那些事???
在win32程序的消息循环函数中
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
DispatchMessag()会调用WndProc()窗口过程函数,直到WndProc()处理完后DispatchMessag()才返回,继续消息循环检索下一条消息,在此之前while()消息循环会停顿掉
在WndProc()函数处理过程中如果又产生了另一个消息B,则必须等这个消息B处理完后wndProc()函数才会返回,而这个消息B也是要由WndProc()函数处理的,即在WndProc()调用的过程中系统接受到消息B后嵌套调用了WndProc(),但此时while消息循环已经停顿了
根据试验,在WndProc()处理过程中发出消息B后,系统通过某种方式跳过while()消息循环获取了消息B,并且又调用了一个WndProc()来处理消息B,等消息B处理完后第二个WndProc()才返回,然后第一个WndProc()继续执行,等第一个WndProc()执行完毕后DispatchMessage()才会返回,然后继续下一轮while()循环
那么,系统是怎样接受到这个消息B的呢?系统是怎样绕过while消息循环获取消息B并且调用第二个WndProc()的,这中间具体发生了哪些事情?网上和书上都没找到详细的处理过程……
我想应该还是跟消息队列有关,不知道系统在这种情况下怎样处理消息队列中的消息的?
求大神们解答 ,谢谢啦
------解决方案--------------------
我不知道你是怎么试的
你可以运行下面的代码
PostMessage时输出是
enter msgv
leave msgv
enter msgv+1
leave msgv+1
SendMessage时输出是
enter msgv
enter msgv+1
leave msgv+1
leave msgv
在win32程序的消息循环函数中
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
DispatchMessag()会调用WndProc()窗口过程函数,直到WndProc()处理完后DispatchMessag()才返回,继续消息循环检索下一条消息,在此之前while()消息循环会停顿掉
在WndProc()函数处理过程中如果又产生了另一个消息B,则必须等这个消息B处理完后wndProc()函数才会返回,而这个消息B也是要由WndProc()函数处理的,即在WndProc()调用的过程中系统接受到消息B后嵌套调用了WndProc(),但此时while消息循环已经停顿了
根据试验,在WndProc()处理过程中发出消息B后,系统通过某种方式跳过while()消息循环获取了消息B,并且又调用了一个WndProc()来处理消息B,等消息B处理完后第二个WndProc()才返回,然后第一个WndProc()继续执行,等第一个WndProc()执行完毕后DispatchMessage()才会返回,然后继续下一轮while()循环
那么,系统是怎样接受到这个消息B的呢?系统是怎样绕过while消息循环获取消息B并且调用第二个WndProc()的,这中间具体发生了哪些事情?网上和书上都没找到详细的处理过程……
我想应该还是跟消息队列有关,不知道系统在这种情况下怎样处理消息队列中的消息的?
求大神们解答 ,谢谢啦
------解决方案--------------------
我不知道你是怎么试的
你可以运行下面的代码
#include <stdio.h>
#include <stdlib.h>
#include<windows.h>
#define msgv (WM_USER+123)
LRESULT CALLBACK WindowProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
switch(uMsg)
{
case msgv:
puts("enter msgv");
PostMessageW(hwnd,msgv+1,0,0);
//SendMessageW(hwnd,msgv+1,0,0);
puts("leave msgv");
return 0;
case msgv+1:
puts("enter msgv+1");
puts("leave msgv+1");
return 0;
case WM_CLOSE:DestroyWindow(hwnd);
return 0;
case WM_DESTROY:PostQuitMessage(0);
return 0;
default:return DefWindowProcW(hwnd,uMsg,wParam,lParam);
}
}
int main()
{
static WNDCLASSEXW WindowClass={sizeof(WNDCLASSEXW),0,WindowProc,0,0,0,0,0,0,0,L"aa",0};MSG msg;HWND hwnd;
WindowClass.hInstance=GetModuleHandleW(0);
hwnd=CreateWindowExW(0,(wchar_t*)(unsigned long)RegisterClassExW(&WindowClass),0,WS_VISIBLE
------解决方案--------------------
WS_OVERLAPPEDWINDOW,200,200,200,200,0,0,0,0);
PostMessageW(hwnd,msgv,0,0);
while(GetMessageW(&msg,0,0,0))DispatchMessageW(&msg);
return 0;
}
PostMessage时输出是
enter msgv
leave msgv
enter msgv+1
leave msgv+1
SendMessage时输出是
enter msgv
enter msgv+1
leave msgv+1
leave msgv