SetTimer是設置定時器,每隔一段時間執行一個操作,原型如下
UINT_PTR SetTimer(
HWND hWnd, // 窗口句柄
UINT_PTR nIDEvent, // 定時器ID,多個定時器時,可以通過該ID判斷是哪個定時器
UINT uElapse, // 時間間隔,單位為毫秒
TIMERPROC lpTimerFunc // 回調函數
);
它是通過分發WM_TIMER消息來觸發回調函數的,看下面代碼
- void CALLBACK TimerProc(HWND hWnd,UINT nMsg,UINT nTimerid,DWORD dwTime)
- {
- printf("%s","abc");
- }
- void main()
- {
- SetTimer(0, 0, 1000, &TimerProc);
- }
你認為上面的代碼會正確執行嗎,答案是不會,回調函數根本得不到執行。因為雖然使用了SetTimer,但是沒有對WM_TIMER消息進行分發,所以不會觸發回調函數,我們修改如下
- void CALLBACK TimerProc(HWND hWnd,UINT nMsg,UINT nTimerid,DWORD dwTime)
- {
- printf("%s","abc");
- }
- void main()
- {
- SetTimer(0, 0, 1000, &TimerProc);
- MSG msg;
- while(GetMessage(&msg,NULL,0,0))
- {
- if(msg.message==WM_TIMER)
- {
- DispatchMessage(&msg);
- }
- }
- }
OK,看到上面的while循環了嗎,這里就是獲取每秒鍾發出的WM_TIMER消息,並分發下去,通知回調函數開始執行。
參考:http://blog.csdn.net/bdmh/article/details/6371443
經測試可行,完整代碼:
#include "stdafx.h" #include "windows.h" #include "stdio.h" void CALLBACK TimerProc(HWND hWnd,UINT nMsg,UINT nTimerid,DWORD dwTime) { printf("%s","abc"); } void main() { SetTimer(0, 0, 1000, &TimerProc); MSG msg; while(GetMessage(&msg,NULL,0,0)) { if(msg.message==WM_TIMER) { DispatchMessage(&msg); } } }
如果這樣寫:
MSG msg; GetMessage(&msg, NULL, 0, 0);
這樣消息隊列是有了,但是沒有人分發消息那還是不行,不會執行TimerProc的內容的。
----------------------------------------------------------------------------------------------
Delphi版本: