レガシー Windows API(概要)について

ここで紹介しているAPIは、Windows95、Windows NT3.5時代のAPI群であり、最新のAPIは含まれていないことに注しして欲しい。なお、当時の解説書は現在よりもより詳細に解説しているため、参考になるはずである。

  • レイアウトを変換する際、崩れているページがあります。
  • 概要およびSampleコードはありますが、APIの解説はありません。

ご要望があれば旧版のWin32 API(HELP形式)をお譲りします。問い合わせフォームより申し込みください。

Windows API タイマの概要

「タイマ」とは、 指定された時間間隔を繰り返し計測する内部ルーチンのことです。システムは、 タイムアウト値と呼ばれる時間間隔が経過するごとに、 タイマが関連付けられているウィンドウに通知を出します。タイマの精度は、 システムのクロック数、 およびアプリケーションがメッセージ キューからメッセージを取得する頻度に依存します。このため、 タイムアウト値は概算値でしかありません。

Microsoft(R) Windows(TM) 用のアプリケーションは、 SetTimer関数を使ってタイマを作成します。この関数にウィンドウ ハンドルを指定すると、 アプリケーションはそのウィンドウ用のタイマを作成し、 タイムアウト値が経過するごとにシステムはウィンドウにWM_TIMERメッセージを送ります。SetTimer関数にウィンドウ ハンドルを渡さない場合は、 タイマを作成したアプリケーションはメッセージ キューのWM_TIMERメッセージを監視し、 適切なウィンドウにメッセージをディスパッチしなければなりません。

タイマは、 作成された時点から時間計測を始めます。アプリケーションは、 SetTimerを使ってタイマのタイムアウト値を変更したり、 KillTimer関数を使ってタイマを破棄したりすることができます。システム リソースを有効に使うために、 不要になったタイマは必ず破棄してください。

作成されたタイマはそれぞれ一意なIDを持ちます。このIDは、 タイマの作成時にアプリケーションが指定することができ、 システムが生成した一意な値を持たせることもできます。WM_TIMERメッセージの第1パラメータには、 メッセージをポストしたタイマのIDが含まれています。

次の各トピックでは、 Win32のタイマについて説明します。

タイマの作成

タイマの破棄

: マウストラップの作成

タイマ関数

タイマの使用

次のトピック以降では、 以下に示すタスクの実行方法を説明しています。[>>]ボタンを使って以下に示すトピックを順番に読んでください。または、 各トピックをクリックすると、 そのトピックの内容を表示できます。

タイマの作成

タイマの破棄

タイマの作成

次のコード例は、 SetTimer関数を使って2つのタイマを作成します。1つ目のタイマは10秒おきに設定され、 2つ目のタイマは5分おきに設定されます。

/* Set two timers. */

SetTimer(hwnd,/* handle of main window */
IDT_TIMER1, /* timer identifier*/
10000,/* 10-second interval*/
(TIMERPROC) NULL);/* no timer callback*/

SetTimer(hwnd,/* handle of main window */
IDT_TIMER2, /* timer identifier*/
300000,/* 5-minute interval*/
(TIMERPROC) NULL);/* no timer callback*/

これらのタイマが生成するWM_TIMERメッセージを処理するため、 WM_TIMER case文をhwndのためのウィンドウ プロシージャに追加します。

case WM_TIMER:

switch (wParam) {

case IDT_TIMER1:

.
. /* Process the 10-second timer. */
.

return 0;

case IDT_TIMER2:

.
. /* Process the 5-minute timer. */
.

return 0;
}

また、 次のコード例のように、 WM_TIMERメッセージをメイン ウィンドウ プロシージャではなく、 アプリケーション定義のコールバック関数で処理するタイマを作成することもできます。この例では、 タイマを作成し、 MyTimerProcコールバック関数を使ってタイマのWM_TIMERメッセージを処理しています。

/* Set the timer. */

SetTimer(hwnd,/* handle of main window */
IDT_TIMER3,/* timer identifier*/
5000,/* 5-second interval*/
(TIMERPROC) MyTimerProc); /* timer callback*/

MyTimerProcの呼び出し規約は、 Microsoft(R) Win32コールバック関数TimerProcに従ったものでなければなりません。

ウィンドウ ハンドルを指定せずにタイマを作成した場合は、 アプリケーションはメッセージ キューのWM_TIMERメッセージを監視し、 適切なウィンドウにメッセージをディスパッチしなければなりません。

HWND hwndTimer;/* handle of window for timer messages */
MSG msg;/* message structure */

while (GetMessage(&msg, /* message structure*/
NULL,/* handle of window receiving msg. */
NULL,/* lowest message to examine*/
NULL))/* 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は、 10秒おきにWM_TIMERメッセージを送るタイマを作成します。アプリケーションは、 WM_TIMERメッセージを受け取るたびにマウス カーソル位置を記録します。マウス カーソルの現在位置が以前の位置と同じであり、 アプリケーションのメイン ウィンドウがアイコン化されているときには、 アプリケーションはマウス カーソルをアイコンのところまで移動します。アプリケーションがクローズされると、 KillTimerはタイマを止めます。

HICON hIcon1;/* icon handle*/
POINT ptOld;/* previous cursor location*/
UINT uResult;/* SetTimer's return value*/
HINSTANCE hinstance;/* handle of 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 of 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 of main window*/
UINT message,/* type of message*/
UINT wParam,/* additional information */
LONG lParam)/* additional information */
{

HDC hdc;/* handle of 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 of 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 of 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 of main window*/
UINT message,/* type of message*/
UINT wParam,/* additional information */
LONG lParam)/* additional information */
{

HDC hdc;/* handle of 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 of 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;
}
}
}

タイマ関数

タイマで使われる関数を、 次に示します。

KillTimer

SetTimer

TimerProc

▲ページトップに戻る

【本を読んでもよくらからない】 … 個別指導でわかりやすくお教えします
inserted by FC2 system