GetMessage/PeekMessage、SendMessage/PostMessage

 1 GetMessage与PeekMessage

(1)GetMessgae函数原型为:

GetMessage(

LPMSG lpMsg,

HWND hWnd,

UINT wMsgFilterMin,

UINT wMsgFilterMax

);
参数:
lpMsg:指向MSG结构的指针,该结构从线程的消息队列里接收消息信息。
hWnd:取得其消息的窗口的句柄。当其值取NULL时,GetMessage为任何属于调用线程的窗口检索消息。
wMsgFilterMin:指定被检索的最小消息值的整数。
wMsgFilterMax:指定被检索的最大消息值的整数。 //如果最小最大消息都设为0,则接收所以消息。
返回值:如果函数取得WM_QUIT之外的其他消息,返回非零值。如果函数取得WM_QUIT消息,返回值是零。如果出现了错误,返回值是-1。例如,当hWnd是无效的窗口句柄或lpMsg是无效的指针时。若想获得更多的错误信息,请调用GetLastError函数。

(2)PeekMessage函数原型为:

BOOL PeekMessage(

LPMSG IpMsg,

HWND hWnd,

UINT wMSGfilterMin,

UINT wMsgFilterMax,

UINT wRemoveMsg

);

参数:

前四个都与GetMessage一致。

wRemoveMsg:消息的处理方式。可以有如下值:

PM_NOREMOVE:PeekMessage,消息不从队列中移除

PM_REMOVE:PeekMessage,消息从队列中移除

PM_NOYIELD:

返回值:如果消息可得到,返回非零值;如果没有消息可得到,返回值是零。

GetMessage与PeekMessage的区别:

(1)若PeekMessage第五个参数设为PM_REMOVE,则与GetMessage函数的行为一致。

(2)返回值不同:GetMessage除了收到WM_QUIT消息会返回0值外,其他消息都返回非0值。而PeekMessage是若收到一个有效消息就返回非0值,否则返回0值。

(3)GetMessage属于堵塞函数,当系统无消息时,GetMessage会等待下一条消息,是不会返回值结束的;PeekMessage是无论消息队列现在有没有消息它都立刻返回一个值然后结束。

所以在消息循环时,两者是有区别的:

GetMessage用法:

while(GetMessage(&msg, NULL, 0, 0))//若消息队列无消息,while是不会进入函数体的

{

  TranslateMessage(&msg);
   DispatchMessage(&msg);

}

PeekMessage用法:

while (TRUE)       
{        
    if (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE))        
    {        
            if (msg.message == WM_QUIT)        
                   break ;        
            TranslateMessage (&msg) ;        
            DispatchMessage (&msg) ;        
    }        
    else        
    {        
            // 完成某些工作的其它行程序        
    }       
}       

 

2 SendMessage与PostMessage

(ps:这里只了解最简单的区别,目前还没用到深的。后面接触到再更新)

SendMessage:将消息直接发送给窗口,并调用该窗口的窗口过程进行处理,在窗口过程对消息处理完毕后,该函数才返回(SendMessage函数发送的消息属于不进队消息)。

PostMessage:将消息放入与创建窗口的线程相关联的消息队列后立即返回。

PostThreadMessage:向线程发送消息。

猜你喜欢

转载自blog.csdn.net/songsong2017/article/details/83502341