windows消息机制,关于windows的消息机制下列说法正确的
3.一种具有窗口和窗口过程功能但没有消息循环的程序
一个程序,如果我们创建了一个窗口,也定义了窗口过程函数,但是如果我们没有建立消息循环会怎么样?我们在win32控制台项目下编写以下代码:
#包含windows.h
#定义WM_TEST 10000
LRESULT回调WndProc(HWND,UINT,WPARAM,LPARAM);
void main()
静态TCHAR szapname[]=TEXT( Test!);
HWND hwnd
wnd class wnd class={ NULL };
wndclass.lpfnWndProc=WndProc
wnd class . style=CS _ HREDRAW CS _ VREDRAW;
wnd class . lpszclassname=SZ appname;
register class(wnd class);
hwnd=CreateWindow(szAppName,
文本(“测试程序”),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
空,
空,
空,
NULL);
ShowWindow(hwnd,SW _ SHOW);
更新窗口(hwnd);
系统(“暂停”);
}
这是一个简单的win32窗口程序,但是我们没有在窗口过程函数WndProc中定义WN_PAINT消息的处理,也没有在main函数中创建窗口后建立消息循环。运行程序后会发生什么?
发现该窗口实际上是被创建的。但是当鼠标上移的时候,会发现形态就像假死一样没有反应。这是因为包括自画消息WM_PAINT在内的所有消息都放在线程的消息队列中,但是我们没有消息循环!我们没有把消息队列里的消息拿出来,更不用说处理了。我们甚至没有窗口进程中WM_PAINT对应的消息处理功能。界面自然地假装死亡。
4.4之间的另一个区别。发送消息和邮件消息
之前写了一篇博文说SendMessage和PostMessage的区别是,SendMessage在消息被处理后才会返回。如果在调用SendMessage后没有处理该消息,SendMessage将被阻止,直到它被处理。PostMessage不会阻塞,直接返回处理结果。其实两者还有一个区别:PostMessage发送的消息会进入消息队列进行提取,而SendMessage发送的消息不会进入消息队列,直接交给窗口过程函数进行处理。为了验证这一说法,我们编写了以下代码:
#包含windows.h
#定义WM_TEST 10000
LRESULT回调WndProc(HWND,UINT,WPARAM,LPARAM);
void main()
静态TCHAR szapname[]=TEXT( Test!);
HWND hwnd
wnd class wnd class={ NULL };
wndclass.lpfnWndProc=WndProc
wnd class . style=CS _ HREDRAW CS _ VREDRAW;
wnd class . lpszclassname=SZ appname;
register class(wnd class);
hwnd=CreateWindow(szAppName,
文本(“测试程序”),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
空,
空,
空,
NULL);
ShowWindow(hwnd,SW _ SHOW);
更新窗口(hwnd);
int i=SendMessage(hwnd,WM_TEST,NULL,NULL);
系统(“暂停”);
}
创建窗口后,我们用SendMessage发送了一条定制消息WM_TEST。在窗口过程函数WndProc中,我们定义了WM_TEST的处理方法是弹出一个MessageBox,返回50。
运行后发现,即使我们创建的表单仍然处于假死状态,MessageBox仍然会弹出,SendMessage的返回值I为50。说明窗口过程函数WndProc中定义的WM_TEST报文的处理代码执行成功!注意,在我们的程序中没有消息循环,但是我们用SendMessage发送的消息仍然由窗口过程函数WndProc处理。
让我们将SendMessage更改为PostMessage,然后重试。运行后发现消息框没有弹出来。为什么?因为PostMessage发送的消息是要进入消息队列的,但是我们没有消息循环,没有使用GetMessage这样的函数从消息队列中获取消息,也没有使用DispatchMessage分发消息,所以PostMessage发送的WM_TEST仍然在消息队列中等待。不执行窗口函数WndProc中的代码。
这就证明了SendMessage和PostMessage的另一个区别:SendMessage发送的消息直接交给相应的窗口过程函数进行处理,而不是进入消息队列,而PostMessage发送的消息却要进入消息队列进行分发和处理。