對(duì)于WINCE下有窗口的程序,可以通過(guò)簡(jiǎn)單的使用API SetTimer來(lái)創(chuàng)建一個(gè)定時(shí)器。當(dāng)定時(shí)器超時(shí)時(shí)窗口會(huì)收到一個(gè)WM_TIMER消息,我們?cè)赪M_TIMER消息中去做定時(shí)器超時(shí)處理即可。而對(duì)于無(wú)窗口的程序,因?yàn)楸旧頉](méi)有消息循環(huán),所以無(wú)法收到WM_TIMER消息,定時(shí)器也就無(wú)法正常工作了。
那么無(wú)窗口程序如何通過(guò)SetTimer來(lái)定時(shí)呢?其實(shí)我們只需在無(wú)窗口程序里的主線程中加一個(gè)消息循環(huán),來(lái)處理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;
- }
- }
- }
但對(duì)于無(wú)窗口的程序這樣還是比較麻煩的,使用定時(shí)器的時(shí)候還得添加消息循環(huán)的代碼,其實(shí)微軟還提供了一個(gè)API timeSetEvent來(lái)創(chuàng)建定時(shí)器,已實(shí)現(xiàn)更精確的定時(shí),參考代碼如下:
-
- #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)
- {
-
- }
最后別忘了調(diào)用timeKillEvent關(guān)閉定時(shí)器。