GetMessage函数是从线程队列中获取属于指定窗口或者其子窗口的消息,并把它们置入一个指定的消息结构中,其原型如下:
如果参数hWnd为NULL,则此函数既可以取得属于调用者线程的任何窗口消息,也可以取得通过对PostThreadMessage的调用而寄送到调用者线程中的消息。如果后两个参数均为零的话,那么此函数可以取得所有可得的消息,即消息范围不受限制。BOOL GetMessage ( LPMSG lpMsg, // 消息结构的地址 HWND hWnd, // 窗口句柄 UINT wMsgFilterMin, // 第一条消息 UINT wMsgFilterMax // 最后一条消息 );
PeekMessage函数是检测线程消息队列,如果队列中有任何消息的话,则它将会把此消息放入指定的消息结构,其原型如下:
BOOL GetMessage ( LPMSG lpMsg, // 消息结构的地址 HWND hWnd, // 窗口句柄 UINT wMsgFilterMin, // 第一条消息 UINT wMsgFilterMax, // 最后一条消息 UINT wRemoveMsg // 去除标志 );
两个函数的主要区别:
1.GetMessage将等到有合适的消息时才返回,而PeekMessage只是撇一下消息队列。
2.GetMessage会将消息从队列中删除,而PeekMessage可以设置最后一个参数wRemoveMsg来决定是否将消息保留在队列中。
在Windows的内部,GetMessage和PeekMessage执行着相同的代码。而两者最大的不同之处则体现在没有任何消息返回到应用程序的情况下。在此种情况下,PeekMessage会返回一个空值到应用程序,GetMessage会在此时让应用程序休眠。
附:TranslateMessage。该函数主要负责将虚拟键消息翻译成字符消息,字符消息被寄送到调用线程的消息队列中,将在线程下次调用GetMessage或PeekMessage被读取。
DispatchMessage。该函数负责将消息返回给Windows。然后Windows负责将该消息发送给适合的窗口过程,也就是说Windows将调用窗口过程。消息处理完后,窗口过程返回Windows,此刻Windows还在DispatchMessage调用中,在结束调用后,Windows回到应用中,接着从下一个GetMessage开始新的消息循环。