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 記熟,同時還有重要的參數是在幹嘛也記一下。

 

edisonx 發表在 痞客邦 PIXNET 留言(0) 人氣()