对于WINCE下有窗口的程序,可以通过简单的使用API SetTimer来创建一个定时器。当定时器超时时窗口会收到一个WM_TIMER消息,我们在WM_TIMER消息中去做定时器超时处理即可。而对于无窗口的程序,因为本身没有消息循环,所以无法收到WM_TIMER消息,定时器也就无法正常工作了。
那么无窗口程序如何通过SetTimer来定时呢?其实我们只需在无窗口程序里的主线程中加一个消息循环,来处理WM_TIMER即可,参考代码如下:
- UINT uTimerID = ::SetTimer(NULL,NULL,1000,NULL);
- MSG msg;
-
- while (GetMessage(&msg, NULL, 0, 0))
- {
- switch(msg.message)
- {
- case WM_QUIT:
- :KillTimer(NULL,uTimerID);
- break;
- case WM_TIMER:
-
- break
- default:
- break;
- }
- }
- }
但对于无窗口的程序这样还是比较麻烦的,使用定时器的时候还得添加消息循环的代码,其实微软还提供了一个API timeSetEvent来创建定时器,已实现更精确的定时,参考代码如下:
-
- #include <mmsytem.h>
- #pragma comment(lib,"mmtimer.lib")
-
- void CALLBACK TrayKeyProc(UINT wTimerID,UINT msg,DWORD dwUser,DWORD dw1,DWORD dw2);
-
- MMRESULT uTimerID = timeSetEvent(1000,1,TimerProc,(DWORD)this,TIME_PERIODIC | TIME_CALLBACK_FUNCTION);
-
-
- void CALLBACK TimerProc(UINT wTimerID,UINT msg,DWORD dwUser,DWORD dw1,DWORD dw2)
- {
-
- }
最后别忘了调用timeKillEvent关闭定时器。
|