|
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル
"全ウィンドウ列挙(コールバックサンプル)"
●このソースについて
・「コールバック関数のアドレス」とやらを使うサンプルです。
・EnumWindowsを使ってウィンドウの一覧ファイルを作成します。
・ファイル名を決め打ちしてますので適当に書き換えて下さい。
・拡張子「CSV」のくせにタブ区切りファイルを吐きます。
●コールバックについて
・コールバック関数とは外部モジュールからも呼べる関数の事です。普通の
DLL内関数もEXEから呼び出せますが、コールバック関数の場合は逆にDLL
からEXEの関数を呼んだり出来ます。受動的に呼び出されるか、能動的に
呼び出される関数を送り込むかが違います。
・コールバック関数は呼び出し規約を「stdcall」にしなくてはなりません。
・コールバック関数のアドレスは「@」演算子を付けると渡せます。
●コンパイルについて
・EnumWin.dprというファイル名で保存してコンパイルして下さい。
・Delphi3.1 & Windows95(無印)上で行ないました。
----------------------------------------------------------------------
program EnumWin;
uses Windows, SysUtils;
var
f: TextFile;
hFirst: HWND;
function EnumWindowsProc(hWindow: HWND; lParam: LongInt):LongInt;stdcall;
var
WinClass, WinText: array[0..1024]of char;
begin
Result:= 0;
if hFirst=0 then hFirst:= hWindow else
if hWindow= hFirst then exit;
GetClassName(hWindow, WinClass, 256);
GetWindowText(hWindow, WinText, 256);
WriteLn(f, IntToStr(hWindow)+#9+
string(WinClass)+#9+
string(WinText));
Result:= 1;
end;
var
lParam: LongInt;
chk: boolean;
begin
lParam:= 0;//←これは適当で良いです。このサンプルでは使いません。
AssignFile(f,'C:\WINDOWS\デスクトップ\TOPWINS.CSV');
try //↑
Rewrite(f);//このファイル名は適宜変えて下さい。
WriteLn(f, 'HWND'+#9+'ウィンドウクラス名'+#9+'テキスト');
hFirst:= 0;
if EnumWindows(@EnumWindowsProc,lParam)= false then exit;
chk:= true;
while chk=true do
chk:= EnumWindows(@EnumWindowsProc,lParam);
finally
CloseFile(f);
end;
end.
----------------------------------------------------------------------
EnumWindowsはAPI(つまりDLL)の関数に自分の関数を渡します。逆に自分側に
他モジュールのコールバック関数を引っ張って来るサンプルはここの#366発言に
「プラグインインターフェースを作る」のタイトルでアップしてあります。呼ぶ
側、呼ばれる側、双方のソースがありますので参考にどうぞ。
折井 哲
VZX00324
Original document by 折井 哲 氏 ID:(VZX00324)
ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。
Copyright 1996-2002 Delphi Users' Forum
|