SetTimer 在 Win32 程式設計是很常用到的一個技巧,但過程要一點觀念,所以這裡先說整個流程,一共會介紹三個 API,這裡先概述。
一開始先用 SetTimer 進行定時執行之動作,這裡包含了 "設定多久執行" 和 "執行什麼函式";
第二個是在 CALLBACK TimerProc 函式處理,這個函式有四個參數,其中最有用的參數是第三個 - idEvent,主要就是拿它來判斷是由哪個計時器發出需求。
第三個是 KillTimer 函式,由於 Timer 計時器可以不只一組 (詳細幾組倒是可以去查查),但計時器數量有限,所以每次用完之後,就要再用 KillTimer 去收回我們分配的計數器。
下面是三個函式之介紹,函式原型部份如果是重點會畫底線
// -------------------------------------------------------------
// SetTimer
MSDN 上的 SetTimer 原型如下
UINT_PTR WINAPI SetTimer(
__in_opt HWND hWnd, // 視窗 handle
__in UINT_PTR nIDEvent, // 一個非零的 Timer 識別
__in UINT uElapse, // 間隔時間,指多久要執行一次,單位 m sec
__in_opt TIMERPROC lpTimerFunc // 函式指標
);
第一個參數視窗 handle 通常都是設 0 進去 (不然就是 NULL),
第二個參數要發出一個 Timer 識別,但在 AutoIt 上沒什麼太大作用 (Win32 作用很大)
第三個參數是多久要執行一次的時間間隔,單位是 m sec
第四個參數說起來有點複雜,它是一個指標,想成是 "函式的位址" 可能會容易點。
傳回 UINT_PTR 資料型態,對應到 autoit 資料型態用 int 即可。
// -------------------------------------------------------------
// CALLBACK TimerProc
VOID CALLBACK TimerProc(
__in HWND hwnd,
__in UINT uMsg,
__in UINT_PTR idEvent, // 判斷由哪個 Timer 發出之訊息
__in DWORD dwTime
);
事實上 SetTimer 第四個函式就是要用這個,這個函式是可以自己寫。正常的說,我們一定要為每個計時器寫出一個 function,而這個 function 的引數就是要像 TimerProc 一樣。
第一個參數 HWND 通常不去理它,
第二個參數 UINT uMsg 在 MSDN 上的解釋是就是 WM_TIMER,這個也不要理它,
第三個參數 UINT_PTR idEvent 這個重要了,它是拿來判斷是由哪個 SetTimer 發出來的訊息,才能做對應處理,
第四個參數 DWORD dwTime,有興趣的話去查 API - GetTickCount 是幹嘛的,這裡我們不用它,
而這函式沒有回傳值。
// -------------------------------------------------------------
// KillTimer
最後 SetTimer、CALLBACK TimerProc 完了之後,最後不用計時器了,釋放就用 KillTimer,MSDN 上原型如下
BOOL WINAPI KillTimer(
__in_opt HWND hWnd,
__in UINT_PTR uIDEvent
);
第一個參數 hwnd 沒什麼意義
第二個參數 uIDEvent 是要刪除的 Timer
好了,介紹暫時到這裡,請先把三個 API 記熟,同時還有重要的參數是在幹嘛也記一下。
留言列表