1. Windows(操作系统)为当前运行的每个Windows程序维护一个“消息队列”。在发生输入事件(用户用鼠标和键盘向窗口输入数据)之后,Windows(操作系统)将事件转换为一个“消息”,并将消息放入程序的消息队列中。
2. 程序通过执行一块被称为“消息循环”的代码从消息队列中取出消息:
while( GetMessage(&msg,NULL,0,0) )
{
TranslateMessage(&msg);
DispatchMessage(&msg);
} msg变量是类型为MSG的结构,类型MSG在WINUSER.H中定义如下:
typedef struct tagMSG
{
HWND hwnd;
UINT message;
WPARAM wParam;
LPARAM lParam;
DWORD time;
POINT pt;
}MSG,*PMSG;
POINT数据类型也是一个结构,在WINDEF.H中定义如下:
typedef struct tagPOINT
{
LONG x;
LONG y;
}POINT,*PPOINT;
3. 消息循环以GetMessage调用开始,它从消息队列中取出一个消息:GetMessage(&msg,NULL,0,0);
这一调用传给Windows(操作系统)一个指向名为msg的MSG结构的指针。第二、第三和第四个参数设置为NULL或者0,表示程序接收它自己创建的所有窗口的所有消息。
Windows 用从消息队列中取出的下一个消息来填充消息结构的各个域,结构的各个域包括:
hwnd 消息发向的窗口的句柄。
message 消息标识符。这是一个数值,用以标识消息。
wParam 一个32位的"message parameter(消息参数)",其含义和数值根据消息的不同而不同。
lParam 一个32位的消息参数,其值与消息有关。
time 消息放入消息队列中的时间。
pt 消息放入消息队列时的鼠标坐标。
只要从消息队列中取出消息的message域不为WM_QUIT(其值为0x0012),GetMessage就返回一个非零值。WM_QUIT消息将导致GetMessage返回0。
4. 语句TranslateMessage(&msg);将msg结构传给Windows(操作系统),进行一些键盘转换。
5. 语
句DispatchMessage(&msg);又将msg结构回传给Windows。然后,Windows 将该消息发送给适当的窗口过程,让它进行处理。这也就是说,
Windows将调用窗口过程。
处理完消息后,窗口过程返回到Windows(操作系统)。此时Windows还停留在DispatchMessage调用中。在结束DispatchMessage调用的处理后,Windows回到程序,并且接着从下一个GetMessage调用开始消息循环。