UINT_PTR SetTimer(HWND hWnd, UINT_PTR nIDEvent, UINT uElapse, TIMERPROC lpTimerFunc);
BOOL KillTimer(HWND hWnd, UINT_PTR uIDEvent);
| 模式 | hWnd | nIDEvent | lpTimerFunc | 處理方式 | KillTimer |
|---|---|---|---|---|---|
| 1. 視窗+ID+訊息 | 有效 | 自訂 ID | NULL | WM_TIMER case wParam 判斷 ID | KillTimer(hWnd, ID) |
| 2. 視窗+ID+回調 | 有效 | 自訂 ID | TimerProc | DefWindowProc 自動呼叫 TimerProc | KillTimer(hWnd, ID) |
| 3. 無視窗+回調 | NULL | 忽略 | TimerProc | 回傳值為新 Timer ID | KillTimer(NULL, retID) |
VOID CALLBACK TimerProc(HWND hwnd, UINT msg, UINT_PTR idTimer, DWORD dwTime);
#define TIMER_SEC 1
#define TIMER_MIN 2
SetTimer(hwnd, TIMER_SEC, 1000, nullptr);
SetTimer(hwnd, TIMER_MIN, 60000, nullptr);
case WM_TIMER:
switch (wParam) {
case TIMER_SEC: /* 每秒 */ break;
case TIMER_MIN: /* 每分 */ break;
}
return 0;
同 hWnd/ID 再次呼叫 SetTimer 即可更新間隔。
WM_TIMER 僅在訊息佇列空閒時處理,若 UI 執行緒忙碌會嚴重延遲WM_TIMER 會合併為一個,導致「漏觸發」case WM_TIMER:
SYSTEMTIME st; GetLocalTime(&st);
// 更新 UI 顯示 st.wHour, st.wMinute, st.wSecond
return 0;
切勿在 WM_TIMER 中自行遞增計數器當作時間依據。