消息循环
2010-04-28 21:55
78 查看
应用程序开始执行后,Windows为该程序建立一个「消息队列」。这个消息队列用来存放该程序可能建立的各种不同窗口的消息。程序中有一小段程序代码,叫做「消息循环」,用来从队列中取出消息,并且将它们发送给相应的窗口消息处理程序。有些消息直接发送给窗口消息处理程序,不用放入消息队列中。
Windows为当前执行的每个应用程序维护一个「消息队列」。在发生输入事件之后,Windows将事件转换为一个「消息」并将消息放入程序的消息队列中。
程序通过执行一块称之为「消息循环」的程序代码从消息队列中取出消息:
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;
消息循环以GetMessage呼叫开始,它从消息队列中取出一个消息:
GetMessage (&msg, NULL, 0, 0)
这一函数调用传给Windows一个指针,指向名为msg的MSG结构。第二、第三和第四个参数设定为NULL或者0,表示程序接收它自己建立的所有窗口的所有消息。Windows用从消息队列中取出的下一个消息来填充消息结构的各个字段,结构的各个字段包括:
hwnd 接收消息的窗口句柄。
message 消息标识符。这是一个数值,用以标识消息。对于每个消息,均有一个对应的标识符,这些标识符定义于Windows表头文件(其中大多数在WINUSER.H中),以前缀WM(「window message」,窗口消息)开头。例如,用户将鼠标光标放在显示区域之内,并按下鼠标左按钮,Windows就在消息队列中放入一个消息,该消息的message字段等于WM_LBUTTONDOWN。这是一个常数,其值为0x0201。
wParam 一个32位的「message parameter(消息参数)」,其含义和数值根据消息的不同而不同。
lParam 一个32位的消息参数,其值与消息有关。
time 消息放入消息队列中的时间。
pt 消息放入消息队列时的鼠标坐标。
只要从消息队列中取出消息的message字段不为WM_QUIT(其值为0x0012),GetMessage就传回一个非零值。WM_QUIT消息将导致GetMessage传回0。
函数
TranslateMessage (&msg) ;
将msg结构传给Windows,进行一些键盘转换。
函数
DispatchMessage (&msg) ;
又将msg结构回传给Windows。然后,Windows将该消息发送给适当的窗口消息处理程序(msg结构中hwnd变量对应的窗口处理程序),让它进行处理。这也就是说,Windows将调用窗口消息处理程序。处理完消息之后,窗口消息处理程序返回到Windows。此时,Windows还停留在DispatchMessage调用中。在结束DispatchMessage调用的处理之后,Windows回到主程序,并且接着从下一个GetMessage调用开始消息循环。
Windows为当前执行的每个应用程序维护一个「消息队列」。在发生输入事件之后,Windows将事件转换为一个「消息」并将消息放入程序的消息队列中。
程序通过执行一块称之为「消息循环」的程序代码从消息队列中取出消息:
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;
消息循环以GetMessage呼叫开始,它从消息队列中取出一个消息:
GetMessage (&msg, NULL, 0, 0)
这一函数调用传给Windows一个指针,指向名为msg的MSG结构。第二、第三和第四个参数设定为NULL或者0,表示程序接收它自己建立的所有窗口的所有消息。Windows用从消息队列中取出的下一个消息来填充消息结构的各个字段,结构的各个字段包括:
hwnd 接收消息的窗口句柄。
message 消息标识符。这是一个数值,用以标识消息。对于每个消息,均有一个对应的标识符,这些标识符定义于Windows表头文件(其中大多数在WINUSER.H中),以前缀WM(「window message」,窗口消息)开头。例如,用户将鼠标光标放在显示区域之内,并按下鼠标左按钮,Windows就在消息队列中放入一个消息,该消息的message字段等于WM_LBUTTONDOWN。这是一个常数,其值为0x0201。
wParam 一个32位的「message parameter(消息参数)」,其含义和数值根据消息的不同而不同。
lParam 一个32位的消息参数,其值与消息有关。
time 消息放入消息队列中的时间。
pt 消息放入消息队列时的鼠标坐标。
只要从消息队列中取出消息的message字段不为WM_QUIT(其值为0x0012),GetMessage就传回一个非零值。WM_QUIT消息将导致GetMessage传回0。
函数
TranslateMessage (&msg) ;
将msg结构传给Windows,进行一些键盘转换。
函数
DispatchMessage (&msg) ;
又将msg结构回传给Windows。然后,Windows将该消息发送给适当的窗口消息处理程序(msg结构中hwnd变量对应的窗口处理程序),让它进行处理。这也就是说,Windows将调用窗口消息处理程序。处理完消息之后,窗口消息处理程序返回到Windows。此时,Windows还停留在DispatchMessage调用中。在结束DispatchMessage调用的处理之后,Windows回到主程序,并且接着从下一个GetMessage调用开始消息循环。
相关文章推荐
- Android应用程序线程消息循环模型分析(2)
- Android 线程之自定义带消息循环Looper的实例
- windows消息循环机制
- 理解WebKit和Chromium: 消息循环(Message Loop)
- win32 消息循环疑惑
- MFC 中消息循环实例
- Windows程序设计零基础自学_1_Windows程序消息循环机制
- MFC中消息循环处理的几个函数之间的区别
- Android 消息循环机制的重要问题和知识点总结
- 看Android开发笔记之:消息循环与Looper的详解有感
- 消息循环占用100%的cpu,添加sleep即可
- Android温习:Looper.loop() android线程中的消息循环
- 消息循环中的TranslateMessage函数
- 应用程序的消息循环
- chromium 线程模型,消息循环
- Android 线程消息循环机制
- QT中|Qt::Tool类型窗口自动退出消息循环问题解决
- Android的消息循环机制 Looper Handler类分析
- Android Handler 消息循环机制
- 退出帐号时handler消息循环造成闪退的问题