请教API应用程序的消息响应过程,详解
发布网友
发布时间:2022-06-02 13:20
我来回答
共1个回答
热心网友
时间:2023-10-25 04:27
OS有自己的消息队列和消息循环,至于消息处理工作OS自己可以完成;
同时OS为当前运行的每个Windows应用程序也建立了各自的消息队列,该应用程序的消息循环和消息处理函数(窗口过程函数)需要由应用程序的代码来编写,但是这些应用程序的消息循环和窗口过程函数中的实现操作,还必须依靠OS来完成。(如消息循环中的GetMessage, TranslateMessage, DispathMessage; 窗口过程中的PlaySound, BeginPaint, GetClientRect, DrawText等都是调用OS来实现的。)
Windows中的消息通常来自两种情况:
鼠标、键盘或时钟等用户操作(又可称为进队消息); 或者调用某些特定的Windows函数(如CreateWindow,ShowWindow,UpdateWindow时产生的)(又可称为不进队消息)<这里的进队、不进队中的队列指的是应用程序的消息队列>
产生的消息传输和处理过程如下:
不进队消息:首先被OS自动捕获,加入OS自己的消息队列中,当轮到该消息的时候,OS直接调用应用程序的消息处理函数(窗口过程WndProc),把该消息传给该函数,WndProc中的switch-case语句进行判断,然后调用相应条件下的系统函数如PlaySound等,做出响应,没有case的,调用系统默认的处理方法DefWindowProc。(这部分的消息通常不是来自用户的输入,而是来自于调用特定的Windows函数是产生的,如CreateWindow,ShowWindow,UpdateWindow等);
进队消息:用户操作后产生的消息,首先由OS捕获,OS将这些消息添加到应用程序自己的消息队列中,在程序中,应用程序的消息循环代码,不断地从自己的消息队列中取出消息(其实还是借助OS的GetMessage函数来去自己的消息),并将该消息键盘转换(还是借助OS,即调用OS的TranslateMessage函数完成),最后将消息分发(同样需借助OS,并由OS的DispatchMessage函数将这些消息分发,也就是由OS将这些消息传给应用程序的窗口过程WndProc函数,做switch-case处理。分发给OS的消息,OS可能仍旧需要放入自己的消息队列中。)
综上可以看到,其实绝大多数的操作必须通过OS来完成,即使是应用程序自己的消息循环和窗口过程,都需要调用大量的OS函数来实现如GetMessage,PlaySound等等。