文档介绍:怎么往SetTimer的回调函数传递参数[策划]从SetTimer看Windows消息处理机制2010-02-0922:07909人阅读评论(0)收藏举报本文说明两个问题:;。首先看第一个问题,我们都知道windows是消息驱动的,windows呈现给用户的任何可以看到听到的东西几乎都是消息驱动的,在底层windows为每个线程准备了一个消息队列,如果用户线程注册了某个消息,那么在适当的时候windows就会将消息投递到该线程的消息队列中,然后由该线程取出队列中的消息,然后处理之,这个过程有两个参与者,一个是windows系统,它主要负责投递消息,收不收是用户线程的事,另一个就是用户线程,它主要负责取出消息并处理消息,即使用户线程因为睡眠或者根本就没有设定消息循环,系统还是会投递的,系统和用户线程的消息接口就是消息队列,这就在用户和系统之间关于消息解除了耦合,在用户线程处理消息的时候,其实还有一个消息队列,因为一个线程不一定只接收一种消息而且不一定马上就能处理完并返回,这个消息队列我们把它叫做消息分发队列或者简称分发队列用来与系统的消息队列区分,注意分发队列里面的消息都是已经格式化后的消息,分发给谁呢,当然是分发给消息的回调函数了,对于有窗口的就是先分发给窗口过程,然后由窗口过程分发给具体的处理函数。下面我们来通过一个例子说明一下,用vs2005或VC建立一个Win32工程,然后看自动生成的代码:intAPIENTRY_tWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPTSTRlpCmdLine,intnCmdShow){...//主消息循环:while(GetMessage(&msg,NULL,0,0)){if(!elerator(,elTable,&msg)){TranslateMessage(&msg);DispatchMessage(&msg);//msg中按照消息号识别}}return(int);}以上就是消息循环,该线程循环接收消息,然后DispatchMessage消息,Dispatch到窗口过程:LRESULTCALLBACKWndProc(HWNDhWnd,UINTmessage,WPARAMwParam,LPARAMlParam){intwmId,wmEvent;PAINTSTRUCTps;HDChdc;switch(message)//message就是消息号{MAND:...default:returnDefWindowProc(hWnd,message,wParam,lParam);}return0;}以上实际上就是windows消息机制的全景,对于windows的timer当然也要套用上面的模式了,在SetTimer调用后,实际上就注册了WM_TIMER消息,以下是函数定义:UINT_PTRSetTimer(HWNDhWnd,UINT_PTRnIDEvent,UINTuElapse,TIMERPROClpTimerFunc);lpTimerFunc就是回调函数,其形式为:VOIDCALLBACKTimerProc(HWNDhwnd,UINTuMsg,UINT