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:向线程发送消息。