對于WINCE下有窗口的程序,可以通過簡單的使用API SetTimer來創(chuàng)建一個定時器。當(dāng)定時器超時時窗口會收到一個WM_TIMER消息,我們在WM_TIMER消息中去做定時器超時處理即可。而對于無窗口的程序,因為本身沒有消息循環(huán),所以無法收到WM_TIMER消息,定時器也就無法正常工作了。
那么無窗口程序如何通過SetTimer來定時呢?其實我們只需在無窗口程序里的主線程中加一個消息循環(huán),來處理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;
- }
- }
- }
但對于無窗口的程序這樣還是比較麻煩的,使用定時器的時候還得添加消息循環(huán)的代碼,其實微軟還提供了一個API timeSetEvent來創(chuàng)建定時器,已實現(xiàn)更精確的定時,參考代碼如下:
-
- #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)閉定時器。
|