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

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

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

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

Windows API シェル ライブラリの概要

ここでは、 Microsoft(R) Windows(TM) オペレーティング システムのシェルの機能について説明します。SHELL.DLLダイナミック リンク ライブラリは、 次に示す機能をサポートしています。

ドラッグ アンド ドロップ機能

アプリケーションを検索して起動するための関連付け

実行可能ファイルからのアイコンの抽出

上記の機能をサポートする関数のヘッダー ファイルはSHELLAPI.Hです。ライブラリはSHELL32.LIBです。

次に示すトピックでは、 Win32のシェル ライブラリについて説明しています。

シェル機能の使用

ドラッグ アンド ドロップ機能の使用

関連付けによるアプリケーションの検索と起動

実行可能ファイルからのアイコンの抽出

シェル ライブラリ関数

シェル ライブラリ メッセージ

シェル機能の使用

ここでは、 アプリケーションでシェル機能を実現する方法について説明します。

ドラッグ アンド ドロップ機能の使用

アプリケーションが「ドラッグ アンド ドロップ」機能を実現していれば、 ユーザーは、 ファイル マネージャでファイルを選択してオープンされているアプリケーションにドラッグし、 ドロップできます。ファイルがドロップされたアプリケーションは、 ファイル名とファイルがドロップされた位置の座標を取得するのに使うメッセージを受け取ります。

ファイル マネージャからドロップされたファイルを受け付けることができるアプリケーションは、 ファイルを受け付けるウィンドウについてDragAcceptFiles関数を呼び出します。DragAcceptFilesに指定したウィンドウでユーザーがマウス ボタンを離してファイルをドロップすると、 ファイル マネージャは、 WM_DROPFILESメッセージをアプリケーションに送ります (アプリケーションがDragAcceptFilesを呼び出していなければ、 ファイル マネージャはWM_DROPFILESメッセージをアプリケーションに送りません)。WM_DROPFILESには、 ドロップされたファイルの名前とファイルがドロップされたときのカーソル位置をアプリケーションが問い合わせるために使う構造体のハンドルが設定されています。アプリケーションは、 DragQueryFile関数を使って、 ドロップされたファイルの個数と名前を取得できます。DragQueryPoint関数は、 ユーザーがマウス ボタンを離したときのカーソルのウィンドウ座標を取得します。

システムがWM_DROPFILESメッセージ用に割り当てたメモリを解放するため、 アプリケーションは、 ドラッグ アンド ドロップ処理が終わったらDragFinish関数を呼び出してください。

たとえば、 次の例のように、 アプリケーションは、 起動時にDragAcceptFiles関数を呼び出して、 WM_DROPFILESメッセージを受け取ったらドラッグ アンド ドロップ関数を呼び出します。

case WM_CREATE:
DragAcceptFiles(hwnd, TRUE);
break;

case WM_DROPFILES:
DragFunc(hwnd, wParam); /* application-defined function */
break;

case WM_DESTROY:
DragAcceptFiles(hwnd, FALSE);
break;

次の例は、 DragQueryPoint関数を使って、 テキストを描画する位置を判断します。まず、 DragQueryFile関数を呼び出して、 ドロップされたファイルの個数を取得します。次に、 DragQueryPointで取得した点から、 各ファイルの名前を描画します。

POINT pt;
WORD cFiles, a;
char lpszFile[80];

DragQueryPoint((HANDLE) wParam, &pt);

cFiles = DragQueryFile((HANDLE) wParam, 0xFFFF, (LPSTR) NULL, 0);
for(a = 0; a < cFiles; pt.y += 20, a++) {
DragQueryFile((HANDLE) wParam, a, lpszFile, sizeof(lpszFile));
TextOut(hdc, pt.x, pt.y, lpszFile, lstrlen(lpszFile));
}

DragFinish((HANDLE) wParam);

関連付けによるアプリケーションの検索と起動

ファイル マネージャには、 ユーザーがファイル名拡張子と特定のアプリケーションを関連付けるための[関連付けるアプリケーションの設定]ダイアログ ボックスがあります。ファイル マネージャは、 この「関連付け」をレジストリ (HKEY_CURRENT_USER\Software\Description\Microsoft\Windows NT\CurrentVersion\Extensions) に格納します。ファイルの拡張子にアプリケーションが関連付けられていれば、 ファイル マネージャでユーザーがそのアプリケーションをダブルクリックすると、 そのアプリケーションが自動的に起動します。

アプリケーションは、 FindExecutable関数とShellExecute関数を使って、 この関連付けによってアプリケーションを検索して起動したり、 ファイルをオープンして印刷できます。

特定のファイル名に関連付けられている実行可能ファイルの名前やハンドルを取得するには、 FindExecutable関数を使います。ShellExecute関数は、 lpszOpパラメータの値に応じて、 指定されたファイルをオープンまたは印刷します。この関数は、 ドキュメント ファイルをオープンするとき、 ファイル名拡張子の関連付けを使います。

実行可能ファイルからのアイコンの抽出

特定の実行可能ファイルやダイナミック リンク ライブラリ、 アイコン ファイルのアイコンのハンドルを取得するには、 ExtractIcon関数を使います。次の例は、 ファイルがドロップされた点の座標をDragQueryPoint関数を使って取得し、 ドロップされたファイルの名前をDragQueryFile関数を使って取得し、 ExtractIcon関数を使ってファイルの最初のアイコンのハンドルを取得します。

POINT pt;
WORD cFiles;
HDC hdc;
char lpszFile[80];
HANDLE hCurrentInst, hicon;

DragQueryPoint((HANDLE) wParam, &pt);

cFiles = DragQueryFile((HANDLE) wParam, 0xFFFF, NULL, NULL);

if(cFiles > 1) {
TextOut(hdc, pt.x, pt.y,
"Please drop only one icon file.", 31);
return FALSE;
}
else {
DragQueryFile((HANDLE) wParam, 0, lpszFile, sizeof(lpszFile));
hCurrentInst = (HINSTANCE) GetWindowLong(hwnd, GWL_HINSTANCE);
hicon = ExtractIcon(hCurrentInst, lpszFile, 0);
if (hicon == NULL)
TextOut(hdc, pt.x, pt.y, "No icons found.", 15);
else if (hicon == (HICON) 1)
TextOut(hdc, pt.x, pt.y,
"File must be .EXE, .ICO, or .DLL.", 33);
else
DrawIcon(hdc, pt.x, pt.y, hicon);
}

DragFinish((HANDLE) wParam);

シェル ライブラリ関数

シェル機能の実装に使われる関数を次に示します。

DragAcceptFiles

DragFinish

DragQueryFile

DragQueryPoint

ExtractAssociatedIcon

ExtractIcon

FindExecutable

ShellAbout

ShellExecute

シェル ライブラリ メッセージ

シェル機能の実装に使われるメッセージを次に示します。

WM_DROPFILES

▲ページトップに戻る

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