我理解的消息循环

我们编写的消息循环的代码:
MSG  msg ;
while (GetMessage(&msg,NULL,0,0))
{
   TranslateMessage(&msg);//翻译消息产生新的消息
   DispatchMessage(&msg);//分配一个消息到窗口过程
   //实际上DispatchMessage将消息传给操作系统
   //,由OS调用窗口过程函数对消息进行处理
}
消息循环过程描述:
(1)当用户点击键盘或鼠标时,系统发送消息到指定进程的消息队列
(2)进程消息循环取出本进程的消息进行处理,处理完成后将消息回传给操作系统(OS)
(3)OS调用窗口处理过程对消息进行处理

看到这里,会产生一些问题。

1、既然最终应用程序进程又把消息回传给OS了,那么为什么还要用消息循环(GetMessage())呢?
原因是OS提供给应用程序对消息进行处理的机会
(放弃某些消息或产生新的消息TranslateMessage(&msg)等)

2、OS如何正确调用窗口过程函数?
每一个窗口在被创建之前都是首先被注册在OS的(包括窗口的样式、窗口处理过程),
而MSG中要保存了这些信息,所以每次OS都能正确地调用各个窗口的处理过程.

DispatchMessage(&msg)把消息传给了OS,那么能不能不仅过OS而直接把消息传给窗口处理过程呢?
答案是肯定的,SendMessage()就实现了这个功能:
1、进队消息和不进队消息的区别?
进队消息:是要经过消息循环才能得到的消息,属于非堵塞模式
不进队消息:不需要经过进队消息而直接发送到窗口处理过程(类似于消息映射机制),属于堵塞模式

2、SendMessge()和PostMessage()区别?
SendMessge()为不进队消息,需要等待窗口处理过程执行完,线程才能继续
PostMessage()为进队消息

声明:以上言论只代表一家之言,难免有不当之处,请各位高手拍砖

原文地址:https://www.cnblogs.com/kuailewangzi1212/p/622602.html