タイマーの使用
このトピックでは、タイマーを作成および破棄する方法と、タイマーを使用して、指定した間隔でマウス入力をトラップする方法について説明します。
このトピックは、次のセクションで構成されています。
タイマーの作成
次の例では 、SetTimer 関数を使用して 2 つのタイマーを作成します。 最初のタイマーは 10 秒ごとに設定され、2 番目のタイマーは 5 分ごとに設定されます。
// Set two timers.
SetTimer(hwnd, // handle to main window
IDT_TIMER1, // timer identifier
10000, // 10-second interval
(TIMERPROC) NULL); // no timer callback
SetTimer(hwnd, // handle to main window
IDT_TIMER2, // timer identifier
300000, // five-minute interval
(TIMERPROC) NULL); // no timer callback
これらのタイマーによって生成されたWM_TIMER メッセージを処理するには、hwnd パラメーターのウィンドウ プロシージャにWM_TIMER case ステートメントを追加します。
case WM_TIMER:
switch (wParam)
{
case IDT_TIMER1:
// process the 10-second timer
return 0;
case IDT_TIMER2:
// process the five-minute timer
return 0;
}
また、次のコード サンプルのように、WM_TIMER メッセージがメイン ウィンドウ プロシージャではなく、アプリケーション定義のコールバック関数によって処理されるタイマーを作成することもできます。タイマーを作成し、コールバック関数 MyTimerProc を使用してタイマーのWM_TIMER メッセージを処理します。
// Set the timer.
SetTimer(hwnd, // handle to main window
IDT_TIMER3, // timer identifier
5000, // 5-second interval
(TIMERPROC) MyTimerProc); // timer callback
MyTimerProc の呼び出し規則は、TimerProc コールバック関数に基づいている必要があります。
アプリケーションでウィンドウ ハンドルを指定せずにタイマーを作成する場合、アプリケーションはメッセージ キューで メッセージWM_TIMER 監視し、適切なウィンドウにディスパッチする必要があります。
HWND hwndTimer; // handle to window for timer messages
MSG msg; // message structure
while (GetMessage(&msg, // message structure
NULL, // handle to window to receive the message
0, // lowest message to examine
0)) // highest message to examine
{
// Post WM_TIMER messages to the hwndTimer procedure.
if (msg.message == WM_TIMER)
{
msg.hwnd = hwndTimer;
}
TranslateMessage(&msg); // translates virtual-key codes
DispatchMessage(&msg); // dispatches message to window
}
タイマーの破棄
アプリケーションでは KillTimer 関数を使用して、不要になったタイマーを破棄する必要があります。 次の例では、定数IDT_TIMER1、IDT_TIMER2、およびIDT_TIMER3によって識別されるタイマーを破棄します。
// Destroy the timers.
KillTimer(hwnd, IDT_TIMER1);
KillTimer(hwnd, IDT_TIMER2);
KillTimer(hwnd, IDT_TIMER3);
タイマー関数を使用したマウス入力のトラップ
画面上にマウス ポインターがある間は、入力を増やさないようにする必要がある場合があります。 これを実現する 1 つの方法は、特定のイベントが発生するまでマウス入力をトラップする特別なルーチンを作成することです。 多くの開発者は、このルーチンを "マウストラックの構築" と参照しています。
次の例では 、SetTimer 関数と KillTimer 関数を使用してマウス入力をトラップします。 SetTimer は、 WM_TIMER メッセージを 10 秒ごとに送信するタイマーを作成します。 アプリケーションは、 WM_TIMER メッセージを受信するたびに、マウス ポインターの位置を記録します。 現在の場所が前の場所と同じで、アプリケーションのメイン ウィンドウが最小化されている場合、アプリケーションはマウス ポインターをアイコンに移動します。 アプリケーションが閉じると、 KillTimer はタイマーを停止します。
HICON hIcon1; // icon handle
POINT ptOld; // previous cursor location
UINT uResult; // SetTimer's return value
HINSTANCE hinstance; // handle to current instance
//
// Perform application initialization here.
//
wc.hIcon = LoadIcon(hinstance, MAKEINTRESOURCE(400));
wc.hCursor = LoadCursor(hinstance, MAKEINTRESOURCE(200));
// Record the initial cursor position.
GetCursorPos(&ptOld);
// Set the timer for the mousetrap.
uResult = SetTimer(hwnd, // handle to main window
IDT_MOUSETRAP, // timer identifier
10000, // 10-second interval
(TIMERPROC) NULL); // no timer callback
if (uResult == 0)
{
ErrorHandler("No timer is available.");
}
LONG APIENTRY MainWndProc(
HWND hwnd, // handle to main window
UINT message, // type of message
WPARAM wParam, // additional information
LPARAM lParam) // additional information
{
HDC hdc; // handle to device context
POINT pt; // current cursor location
RECT rc; // location of minimized window
switch (message)
{
//
// Process other messages.
//
case WM_TIMER:
// If the window is minimized, compare the current
// cursor position with the one from 10 seconds
// earlier. If the cursor position has not changed,
// move the cursor to the icon.
if (IsIconic(hwnd))
{
GetCursorPos(&pt);
if ((pt.x == ptOld.x) && (pt.y == ptOld.y))
{
GetWindowRect(hwnd, &rc);
SetCursorPos(rc.left, rc.top);
}
else
{
ptOld.x = pt.x;
ptOld.y = pt.y;
}
}
return 0;
case WM_DESTROY:
// Destroy the timer.
KillTimer(hwnd, IDT_MOUSETRAP);
PostQuitMessage(0);
break;
//
// Process other messages.
//
}
次の例では、マウス入力をトラップする方法も示していますが、アプリケーション のメッセージ キュー ではなく、アプリケーション定義のコールバック関数 MyTimerProc を介してWM_TIMER メッセージを処理します。
UINT uResult; // SetTimer's return value
HICON hIcon1; // icon handle
POINT ptOld; // previous cursor location
HINSTANCE hinstance; // handle to current instance
//
// Perform application initialization here.
//
wc.hIcon = LoadIcon(hinstance, MAKEINTRESOURCE(400));
wc.hCursor = LoadCursor(hinstance, MAKEINTRESOURCE(200));
// Record the current cursor position.
GetCursorPos(&ptOld);
// Set the timer for the mousetrap.
uResult = SetTimer(hwnd, // handle to main window
IDT_MOUSETRAP, // timer identifier
10000, // 10-second interval
(TIMERPROC) MyTimerProc); // timer callback
if (uResult == 0)
{
ErrorHandler("No timer is available.");
}
LONG APIENTRY MainWndProc(
HWND hwnd, // handle to main window
UINT message, // type of message
WPARAM wParam, // additional information
LPARAM lParam) // additional information
{
HDC hdc; // handle to device context
switch (message)
{
//
// Process other messages.
//
case WM_DESTROY:
// Destroy the timer.
KillTimer(hwnd, IDT_MOUSETRAP);
PostQuitMessage(0);
break;
//
// Process other messages.
//
}
// MyTimerProc is an application-defined callback function that
// processes WM_TIMER messages.
VOID CALLBACK MyTimerProc(
HWND hwnd, // handle to window for timer messages
UINT message, // WM_TIMER message
UINT idTimer, // timer identifier
DWORD dwTime) // current system time
{
RECT rc;
POINT pt;
// If the window is minimized, compare the current
// cursor position with the one from 10 seconds earlier.
// If the cursor position has not changed, move the
// cursor to the icon.
if (IsIconic(hwnd))
{
GetCursorPos(&pt);
if ((pt.x == ptOld.x) && (pt.y == ptOld.y))
{
GetWindowRect(hwnd, &rc);
SetCursorPos(rc.left, rc.top);
}
else
{
ptOld.x = pt.x;
ptOld.y = pt.y;
}
}
}
関連トピック