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

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

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

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

Windows API スクリーン セーバー ライブラリの概要

Microsoft(R) Win32(R) アプリケーション プログラミング インターフェイス (API) は、 マウスとキーボードが一定時間アイドル状態のときに起動されるスクリーン セーバーと呼ばれる特殊なアプリケーションをサポートしています。スクリーン セーバーの目的は、 次の2つです。

画面に同じ画像を表示し続けることによる蛍光体の焼き付きを防ぐこと

画面の重要な情報を隠すこと

次に示すトピックでは、 スクリーン セーバーについて説明しています。

スクリーン セーバー関数の使用

スクリーン セーバーの作成

構成ダイアログ ボックスのサポート

スクリーン セーバー用ウィンドウ プロシージャのサポート

モジュール定義ファイルの作成

新しいスクリーン セーバーのインストール

ヘルプの追加

スクリーン セーバー関数

ユーザーは、 Windowsコントロール パネルの[画面のデザイン]アプリケーションを使って、 スクリーン セーバーのリストからの選択、 スクリーン セーバーを起動するまでの時間の指定、 スクリーン セーバーの設定、 スクリーン セーバーのテストを行うことができます。スクリーン セーバーは、 Windowsの起動時や、 ユーザーがコントロール パネルでスクリーン セーバー機能をアクティブにしたときに自動的にロードされます。

スクリーン セーバーを選択すると、 Windowsは、 キーストロークとマウスの移動を監視して、 一定時間動作がなければスクリーン セーバーを起動します。しかし、 次に示す場合、 Windowsはスクリーン セーバーを起動しません。

アクティブなアプリケーションがWindows用アプリケーションでないとき。

CBT (コンピュータ ベースのトレーニング) ウィンドウが存在するとき。

アクティブなアプリケーションが、 wParamSC_SCREENSAVE値の設定されたWM_SYSCOMMANDメッセージを受け取って、 そのメッセージをDefWindowProcに渡さないとき。

スクリーン セーバーには、 スクリーン セーバー固有のエクスポートされる関数、 リソース定義、 変数宣言があります。スタティック リンク ライブラリのSCRNSAVE.LIBには、 スクリーン セーバーに必要なmain関数や初期化コードがあります。スクリーン セーバーが起動すると、 SCRNSAVE.LIBの初期化コードがフルスクリーン ウィンドウを作成します。このウィンドウのウィンドウ クラスは、 次のように定義されています。

WNDCLASS cls;

cls.hCursor= NULL;
cls.hIcon= LoadIcon(hInst, MAKEINTATOM(ID_APP));
cls.lpszMenuName= NULL;
cls.lpszClassName= "WindowsScreenSaverClass";
cls.hbrBackground= GetStockObject(BLACK_BRUSH);
cls.hInstance= hInst;
cls.style= CS_VREDRAW | CS_HREDRAW
| CS_SAVEBITS | CS_DBLCLKS;
cls.lpfnWndProc= (WNDPROC)ScreenSaverProc;
cls.cbWndExtra= 0;
cls.cbClsExtra= 0;

通常、 スクリーン セーバーを作成するには、 3つの必須関数を含むソース コード モジュールを作成し、 SCRNSAVE.LIBとリンクします。スクリーン セーバー モジュールが担当するのは、 自分自身の構成と視覚効果の提供だけです。

スクリーン セーバー モジュールに必要な関数の1つは、 ScreenSaverProcです。この関数は、 メッセージを処理し、 処理しなかったメッセージをSCRNSAVE.LIBに渡します。ScreenSaverProcが処理するメッセージの一部を次の表に示します。

メッセージ 説明

WM_CREATE REGEDIT.INIファイルから、 初期化データを取得します。スクリーン セーバー ウィンドウのウィンドウ タイマを設定します。必要な初期化を行います。

WM_ERASEBKGND スクリーン セーバー ウィンドウを消去し、 以降の描画操作の準備をします。

WM_TIMER 描画操作を実行します。

WM_DESTROY アプリケーションがWM_CREATEメッセージを処理するときに作成したタイマを破棄します。必要な後始末を行います。

ScreenSaverProcは、 DefScreenSaverProc関数を呼び出して、 処理しなかったメッセージをSCRNSAVE.LIBに渡します。この関数によるメッセージ処理を次の表に示します。

メッセージ 動作

WM_SETCURSOR カーソルをNULLカーソルに設定して、 画面に表示されないようにします。

WM_PAINT 画面の背景を描画します。

WM_LBUTTONDOWN スクリーン セーバーを終了します。

WM_MBUTTONDOWN スクリーン セーバーを終了します。

WM_RBUTTONDOWN スクリーン セーバーを終了します。

WM_KEYDOWN スクリーン セーバーを終了します。

WM_MOUSEMOVE スクリーン セーバーを終了します。

WM_ACTIVATE wParamFALSEならば、 スクリーン セーバーを終了します。

スクリーン セーバー モジュールに必要な2つ目の関数は、 ScreenSaverConfigureDialogです。この関数は、 ユーザーがスクリーン セーバーを設定するためのダイアログ ボックスを表示します (このため、 アプリケーションは、 対応するダイアログ ボックス テンプレートを用意しなければなりません)。ユーザーがコントロール パネルの[画面のデザイン]アプリケーションの[スクリーン セーバー]ボックスで[設定]ボタンを選択すると、 Windowsは、 構成ダイアログ ボックスを表示します。ユーザーが構成ダイアログ ボックスで入力したデータは、 REGEDIT.INIファイルに格納されます。

スクリーン セーバー モジュールに必要な3つ目の関数は、 RegisterDialogClassesです。この関数は、 すべてのスクリーン セーバー アプリケーションで呼び出さなければなりません。しかし、 構成ダイアログ ボックスで特別なウィンドウやカスタム コントロールを必要としないアプリケーションの場合は、 TRUEを返すだけでかまいません。カスタム コントロールや特別なウィンドウを必要とするアプリケーションは、 この関数を使って、 対応するウィンドウ クラスを登録してください。

スクリーン セーバーは、 上記の3つの関数をサポートするモジュールを作成するほかに、 アイコンを用意しなければなりません。このアイコンは、 スクリーン セーバーをスタンドアロンのアプリケーションとして実行したときだけ表示されます (スクリーン セーバーをコントロール パネルから実行するには、 .SCRファイル名拡張子を付けなければなりません。また、 スタンドアロンのアプリケーションとして実行するには、 .EXEファイル名拡張子を付けなければなりません)。アイコンは、 スクリーン セーバーのリソース ファイルで定数ID_APPで識別しなければなりません。この定数は、 SCRNSAVE.Hヘッダー ファイルで定義されています。

最後に、 もう1つ必要なのは、 スクリーン セーバーを記述する文字列です。スクリーン セーバーのリソース ファイルには、 コントロール パネルがスクリーン セーバーの名前として表示する記述文字列を含めなければなりません。記述文字列は、 リソース ファイルの文字列テーブルの最初の文字列 (序数値1で識別される文字列) でなければなりません。

スクリーン セーバー関数の使用

ここでは、 スクリーン セーバー アプリケーションから抜粋したコード例を使って、 次に示す作業を説明します。

スクリーン セーバーの作成

スクリーン セーバーのダイアログ ボックス テンプレートの作成

スクリーン セーバーのウィンドウ プロシージャのサポート

モジュール定義ファイルの作成

また、 新しいスクリーン セーバーのインストールや、 スクリーン セーバー アプリケーションのヘルプの追加についても説明します。

スクリーン セーバーの作成

ここでは、 スクリーン セーバー アプリケーションから抜粋したコード例を示します。このアプリケーションは、 1秒から10秒の間隔で、 4つの色 (白、 明るい灰色、 暗い灰色、 黒) のいずれかで画面を再描画します。アプリケーションは、 WM_TIMERメッセージを受け取ると画面を再描画します。ユーザーは、 アプリケーションの構成ダイアログ ボックスを表示して、 水平スクロール バーを調整することによって、 このメッセージが送られる間隔を調整できます。

構成ダイアログ ボックスのサポート

通常、 スクリーン セーバーには、 色や描画速度、 線の太さ、 フォントなどのカスタマイズ データをユーザーが指定するための構成ダイアログ ボックスがあります。構成ダイアログ ボックスをサポートするには、 アプリケーションは、 必要なダイアログ ボックス テンプレートを用意し、 ScreenSaverConfigureDialog関数をサポートしなければなりません。サンプル アプリケーションのダイアログ ボックス テンプレートを次に示します。

DLG_SCRNSAVECONFIGURE DIALOG 6, 18, 160, 63
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "Sample Screen-Saver Setup"
FONT 8, "MS Sans Serif"
BEGIN
GROUPBOX"Redraw Speed", 101, 0, 6, 98, 40
SCROLLBARID_SPEED, 5, 31, 89, 10
LTEXT"Fast", 103, 6, 21, 20, 8
LTEXT"Slow", 104, 75, 21, 20, 8
PUSHBUTTON"OK", ID_OK, 117, 10, 40, 14
PUSHBUTTON"Cancel", ID_CANCEL, 117, 32, 40, 14
END

ダイアログ ボックスを識別するための定数は、 次のように、 10進値の2003として定義しなければなりません。

#defineDLG_SCRNSAVECONFIGURE 2003

次の例は、 サンプル アプリケーションのScreenSaverConfigureDialog関数を示しています。

#define MINVEL1/* minimum redraw-speed value*/
#define MAXVEL10/* maximum redraw-speed value*/
#define DEFVEL5/* default redraw-speed value*/

LONGlSpeed = DEFVEL;/* redraw-speed variable*/

extern HINSTANCE hMainInstance; /* screen saver instance handle*/

CHARszAppName[80];/* .INI section name*/
CHARszTemp[20];/* temporary array of characters */
CHARszRedrawSpeed[] = "Redraw Speed";/* .INI speed entry*/

BOOL WINAPI ScreenSaverConfigureDialog(hDlg, message, wParam, lParam)
HWNDhDlg;
UINTmessage;
DWORD wParam;
LONGlParam;
{
static HWND hSpeed; /* handle of speed scroll bar */
static HWND hOK;/* handle of OK push button */

switch(message)
{
case WM_INITDIALOG:

/* Retrieve the application-name string from the .RC file. */

LoadString(hMainInstance, idsAppName, szAppName, 40);

/* Retrieve the .INI (or registry) filename. */

LoadString(hMainInstance, idsIniFile, szIniFile, MAXFILELEN);

/* Retrieve any redraw-speed data from the registry. */

lSpeed = GetPrivateProfileInt(szAppName, szRedrawSpeed,
DEFVEL, szIniFile);

/*
* If the initialization file does not contain an entry
* for this screen saver, use the default value.
*/

if(lSpeed > MAXVEL || lSpeed < MINVEL)
lSpeed = DEFVEL;

/* Initialize the redraw-speed scroll bar control. */

hSpeed = GetDlgItem(hDlg, ID_SPEED);
SetScrollRange(hSpeed, SB_CTL, MINVEL, MAXVEL, FALSE);
SetScrollPos(hSpeed, SB_CTL, lSpeed, TRUE);

/* Retrieve a handle of the OK push button control. */

hOK = GetDlgItem(hDlg, ID_OK);

return TRUE;

case WM_HSCROLL:

/*
* Process scroll bar input, adjusting the lSpeed
* value as appropriate.
*/

switch (LOWORD(wParam))
{
case SB_PAGEUP:
--lSpeed;
break;

case SB_LINEUP:
--lSpeed;
break;

case SB_PAGEDOWN:
++lSpeed;
break;

case SB_LINEDOWN:
++lSpeed;
break;

case SB_THUMBPOSITION:
lSpeed = HIWORD(wParam);
break;

case SB_BOTTOM:
lSpeed = MINVEL;
break;

case SB_TOP:
lSpeed = MAXVEL;
break;

case SB_THUMBTRACK:
case SB_ENDSCROLL:
return TRUE;
break;
}
if ((int) lSpeed <= MINVEL)
lSpeed = MINVEL;
if ((int) lSpeed >= MAXVEL)
lSpeed = MAXVEL;

SetScrollPos((HWND) lParam, SB_CTL, lSpeed, TRUE);
break;

case WM_COMMAND:
switch(LOWORD(wParam))
{
case ID_OK:

/*
* Write the current redraw-speed variable to
* the .INI file.
*/

wsprintf(szTemp, "%ld", lSpeed);
WritePrivateProfileString(szAppName, szRedrawSpeed,
szTemp, szIniFile);

case ID_CANCEL:
EndDialog(hDlg, LOWORD(wParam) == ID_OK);
return TRUE;
}
}
return FALSE;
}

アプリケーションは、 ダイアログ ボックス テンプレートとそれをサポートするScreenSaverConfigureDialog関数のほかに、 RegisterDialogClasses関数も用意しなければなりません。この関数は、 スクリーン セーバーで必要な非標準ウィンドウ クラスを登録します。サンプル アプリケーションではダイアログ ボックス プロシージャで標準ウィンドウ クラスしか使わないため、 この関数は、 次の例のようにTRUEを返すだけです。

BOOL WINAPI RegisterDialogClasses(hInst)
HANDLEhInst;
{
return TRUE;
}

スクリーン セーバー用ウィンドウ プロシージャのサポート

各スクリーン セーバーは、 ScreenSaverProcという名前のウィンドウ プロシージャをサポートしなければなりません。ScreenSaverProcは、 通常のウィンドウ プロシージャと同様に、 特定のメッセージを処理して、 処理しなかったメッセージをデフォルトのプロシージャに渡します。しかし、 ScreenSaverProcは、 処理しなかったメッセージをDefWindowProc関数ではなくDefScreenSaverProc関数に渡します。ScreenSaverProcと通常のウィンドウ プロシージャのもう1つの違いは、 ScreenSaverProcに渡されるハンドルがクライアント ウィンドウではなくデスクトップ全体を識別する点です。次の例は、 サンプルのスクリーン セーバーのScreenSaverProcウィンドウ プロシージャです。

LONG WINAPI ScreenSaverProc(hwnd, message, wParam, lParam)

HWNDhwnd;

UINTmessage;

DWORD wParam;

LONGlParam;

{

static HDC hdc;/* device-context handle */

static RECTrc;/* RECT structure */

static UINTuTimer; /* timer identifier */

switch(message)

{

case WM_CREATE:

/* Retrieve the application name from the .RC file. */

LoadString(hMainInstance, idsAppName, szAppName, 40);

/* Retrieve the .INI (or registry) filename. */

LoadString(hMainInstance, idsIniFile, szIniFile,

MAXFILELEN);

/* Retrieve any redraw-speed data from the registry. */

lSpeed = GetPrivateProfileInt(szAppName, szRedrawSpeed,

DEFVEL, szIniFile);

/*

* Set a timer for the screen saver window using the

* redraw-rate stored in REGEDIT.INI.

*/

uTimer = SetTimer(hwnd, 1, lSpeed * 1000, NULL);

break;

case WM_ERASEBKGND:

/*

* The WM_ERASEBKGND message is issued before the

* WM_TIMER message, allowing the screen saver to

* paint the background as appropriate.

*/

hdc = GetDC(hwnd);

GetClientRect (hwnd, &rc);

FillRect (hdc, &rc, GetStockObject(BLACK_BRUSH));

ReleaseDC(hwnd,hdc);

break;

case WM_TIMER:

/*

* The WM_TIMER message is issued at (lSpeed * 1000)

* intervals, where lSpeed == .001 seconds. This

* code repaints the entire desktop with a white,

* light gray, dark gray, or black brush each

* time a WM_TIMER message is issued.

*/

hdc = GetDC(hwnd);

GetClientRect(hwnd, &rc);

if (i++ <= 4)

FillRect(hdc, &rc, GetStockObject(i));

else

(i = 0);

ReleaseDC(hwnd,hdc);

break;

case WM_DESTROY:

/*

* When the WM_DESTROY message is issued, the screen saver

* must destroy any of the timers that were set at WM_CREATE

* time.

*/

if (uTimer)

KillTimer(hwnd, uTimer);

break;

}

/*

* DefScreenSaverProc processes any messages

* ignored by ScreenSaverProc.

*/

return DefScreenSaverProc(hwnd, message, wParam, lParam);

}

モジュール定義ファイルの作成

アプリケーションのモジュール定義ファイルでは、 ScreenSaverProc関数とScreenSaverConfigureDialog関数をエクスポートしなければなりません。しかし、 RegisterDialogClasses関数はエクスポートしないでください。次の例は、 サンプル アプリケーションのモジュール定義ファイルを示しています。

NAMESSTEST.SCR

DESCRIPTION 'SCRNSAVE : Test'

STUB 'WINSTUB.EXE'
EXETYPE WINDOWS

CODE MOVEABLE
DATA MOVEABLE MULTIPLE

HEAPSIZE1024
STACKSIZE 4096

EXPORTS
ScreenSaverProc
ScreenSaverConfigureDialog

新しいスクリーン セーバーのインストール

コントロール パネルは、 利用可能なスクリーン セーバーのリストを作成するとき、 Windowsディレクトリで.SCR拡張子のファイルを検索します。スクリーン セーバーは.EXE拡張子を持つ標準Windows実行可能ファイルであるため、 .SCR拡張子に変更して、 適切なディレクトリにコピーしなければなりません。

ヘルプの追加

通常、 スクリーン セーバーの構成ダイアログ ボックスには、 [ヘルプ]ボタンがあります。スクリーン セーバーは、 ほかのWindows用アプリケーションでヘルプを実現するのと同様に、 [ヘルプ]ボタンの識別子を調べて、 WinHelp関数を呼び出せます。

スクリーン セーバー関数

スクリーン セーバーに関する関数を次に示します。

DefScreenSaverProc

RegisterDialogClasses

ScreenSaverConfigureDialog

ScreenSaverProc

 

▲ページトップに戻る

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