
function SetTimer(hWnd: HWND;nIDEvent: UINT;uElapse: UINT;lpTimerFunc: TFNTimerProc):UINT;stdcall;
参数hWnd,是程序拥有的窗口句柄。
nIDEvent,定时器的编号,可为大于0或小于2^32-1的任意整数,对于使用同一个窗口句柄的所有定时器来说,编号必须唯一。
uElapse,每次触发的时间间隔,单位为毫秒。
lpTimerFunc,触发时所调用的回调函数地址,如果你使用窗口消息的触发方式,传入NIL即可!
如果成功则返回定时器编号,失败则返回0。
WM_TIMER 传递的消息结构如下:
TWMTimer = record
Msg: Cardinal; // 消息编号
TimerID: Longint; // 定时器编号
TimerProc: TFarProc; // 回调函数
Result: Longint; // 返回值
end;
每当定时器触发时,系统会产生一个WM_TIMER 消息到拥有该窗体线程的消息队列,当消息循环中的DispatchMessage遇到WM_TIMER 时,会进行特别处理,检查它的创建函数的第四个参数是否为NIL。如果TimeProc为NIL,此时DispatchMessage会象处理正常消息一样,调用窗口的窗口过程,把WM_TIMER 交给该窗口过程处理。如果TimeProc不为NIL,则此时DispatchMessage直接调用TimeProc。
WM_RIMER和WM_PAINT一样,都是属于低优先权的窗口消息,只有在消息队列没有其它消息的时候,这两个消息才会被取出处理。另外还有一个特性,一个消息队列绝不会含有多于一个的WM_RIMER或WM_PAINT。比如说上次的WM_RIMER还没处理完,则新的WM_RIMER就不会进入消息队列。
补充一点,定时器用完时要记得释放,即便是程序结束时会自动释放所有的资源,最好还是养成自己主动清理的习惯。关闭定时器,调用KILLTIMER函数就可以了!
function KillTimer(hwnd: HWND;uIDEvent: UINT): BOOL;
第一个参数创建时所传入的窗口句柄,第二个参数是定时器的编号。