消息和消息处理之消息循环



在Win32编程中,消息循环是相当重要的一个概念,看似很难,但使用起来却是非常简单。在WinMain函数的最后,有下列代码:
 
while (GetMessage (&msg, NULL, 0, 0))  {  TranslateMessage (&msg)    // 转换某些键盘消息  DispatchMessage (&msg) 
 
 
// 将消息发送给窗口过程,这里是WndProc
}
 
Windows应用程序可以接收以各种形式输入的信息,这包括键盘、鼠标动作、计时器产生的消息,也可以是其他应用程序发来的消息等。Windows系统自动监控所有的输入设备,并将其消息放入该应用程序的消息队列中。
GetMessage函数就是用来从应用程序的消息队列中按照先进先出的原则将这些消息一个个地取出来,放进一个MSG结构中去。它的原型如下:
 
BOOL GetMessage(       LPMSG   lpMsg,    // 指向一个MSG结构的指针,用来保存消息    

HWND   hWnd,     // 指定哪个窗口的消息将被获取    

 UINT   wMsgFilterMin,  // 指定获取的主消息值的最小值    

 UINT   wMsgFilterMax // 指定获取的主消息值的最大值
);

GetMessage函数用来将获取的消息复制到一个MSG结构中。如果队列中没有任何消息,该函数将一直空闲直到队列中又有消息时再返回。如果队列中已有消息,它将取出一个后返回。MSG结构包含Windows消息的完整信息,其定义如下:
 
typedef struct {     HWND   hwnd;     // 消息发向的窗口的句柄    

 UINT  message;   // 主消息的标识值 
  WPARAM   wParam;    // 附消息值,其具体含义依赖于主消息值    

 LPARAM   lParam;    // 附消息值,其具体含义依赖于主消息值    

 DWORD   time;    // 消息放入消息队列中的时间    

 POINT   pt;  // 消息放入消息队列时的鼠标坐标
} MSG, *PMSG;
 
上述结构中的主消息表明了消息的类型,例如,是键盘消息还是鼠标消息等,附消息的含义则依赖于主消息值,例如,如果主消息是键盘消息,那么附消息中则存储了是键盘的哪个具体键的信息。
事实上,GetMessage函数还可以过滤消息,它的第二个参数是用来指定从哪个窗口的消息队列中获取消息,其他窗口的消息将被过滤掉。如果该参数为NULL,则GetMessage从该应用程序线程的所有窗口的消息队列中获取消息。第三个和第四个参数是用来过滤MSG结构中主消息值的,主消息值在wMsgFilterMin和wMsgFilterMax之外的消息将被过滤掉。如果这两个参数为0,则表示接收所有消息。
特别地,当且仅当GetMessage函数在获取到WM_QUIT消息后,将返回0值,于是程序退出消息循环。
TranslateMessage函数的作用是把虚拟键消息转换到字符消息,以满足键盘输入的需要。DispatchMessage函数所完成的工作是把当前的消息发送到对应的窗口过程中去。

你可能感兴趣的:(消息和消息处理之消息循环)