消息处理机制
本文说明两个问题:1.windows 的消息处理机制;2.怎么往 SetTimer 的回调函数
传递参数。首先看第一个问题,我们都知道 windows 是消 息驱动的,windows
呈现给用户的任何可以看到听到的东西几乎都是消息驱动的,在底层 windows
为每个线程准备了一个消息队列,如果用户线程注册 了某个消息,那么在适当
的时候 windows 就会将消息投递到该线程的消息队列中,然后由该线程取出队
列中的消息,然后处理之,这个过程有两个参与者,一 个是 windows 系统,它
主要负责投递消息,收不收是用户线程的事,另一个就是用户线程,它主要负
责取出消息并处理消息,即使用户线程因为睡眠或者根本 就没有设定消息循环,
系统还是会投递的,系统和用户线程的消息接口就是消息队列,这就在用户和
系统之间关于消息解除了耦合,在用户线程处理消息的时候,其 实还有一个消
息队列,因为一个线程不一定只接收一种消息而且不一定马上就能处理完并返
回,这个消息队列我们把它叫做消息分发队列或者简称分发队列用来与系 统的
消息队列区分,注意分发队列里面的消息都是已经格式化后的消息,分发给谁
呢?当然是分发给消息的回调函数了,对于有窗口的就是先分发给窗口过程,
然后 由窗口过程分发给具体的处理函数。
下面我们来通过一个例子说明一下,用 vs2005 或 VC 建立一个 Win32 工程,然
后看自动生成的代码:
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
...
// 主消息循环:
while (GetMessage(&msg, NULL, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);//msg 中按照消息号识别
}