Win95/98で、ウィンドゥハンドルから、実行アプリ名を知る
|
Win95 では、ToolHelp32 を使って取得できます。WinNT ではこの方法では使えません。
http://www.microsoft.com/japan/support/kb/articles/J041/6/32.htm
に、Win95/NT 両方で使える方法が C 言語で書かれてます。
ここでは、上記の部分的丸写しですが、ToolHelp32を使った例を示します。
コールバック関数を適切に作れば、プロセスIDとファイル名が列挙できますので、ウィンドゥハンドルからID(ProcessID)を
GetWindowThreadProcessID(WH: hWnd; @ID); 関数
で取得し、一致するものを探せば実行アプリ名を取得できます。
uses TLHelp32;
type
TEnumProcs = function(ID: DWord; Str: PChar; LP: LParam):bool; stdcall;
procedure EnumProcesses95(lpEnumFunc: TEnumProcs; lParam: longint);
var
// 関数ポインタ
CreateToolhelp32Snapshot: TCreateToolhelp32Snapshot;
Process32First: TProcess32First;
Process32Next: TProcess32Next;
// 変数
hLib: THandle;
Snapshot: THandle;
ProcEntry: TProcessEntry32;
Flag: boolean;
begin
// Kernel32.DLL のロード
hLib := LoadLibraryA('Kernel32.dll');
if hLib = 0 then
raise Exception.Create('Kernel32.dll がロードできません。');
// API のアドレス取得(使用するのは以下の3個)
CreateToolhelp32Snapshot := TCreateToolhelp32Snapshot(
GetProcAddress(hLib, 'CreateToolhelp32Snapshot'));
Process32First := TProcess32First(GetProcAddress(hLib, 'Process32First'));
Process32Next := TProcess32Next(GetProcAddress(hLib, 'Process32Next'));
// ロードをチェック
if (not Assigned(CreateToolhelp32Snapshot))
or (not Assigned(Process32First))
or (not Assigned(Process32Next)) then
begin
FreeLibrary(hLib);
raise Exception.Create('API のアドレスを取得できません。');
end;
// スナップショットを行う
Snapshot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if Snapshot = INVALID_HANDLE_VALUE then
begin
FreeLibrary(hLib);
raise Exception.Create('Toolhelp32 スナップショットが取得できません。');
end;
// TProcessEntry32構造体の初期化
ProcEntry.dwSize := SizeOf(TProcessEntry32);
// 最初のプロセスの取得
Flag := Process32First(Snapshot, ProcEntry);
while Flag do
begin
// コールバック関数呼び出し
if not lpEnumFunc(ProcEntry.th32ProcessID, ProcEntry.szExeFile, lParam) then
break;
// 次のプロセスの取得
Flag := Process32Next(Snapshot, ProcEntry);
end;
// 解放
CloseHandle(Snapshot);
FreeLibrary(hLib);
end;
// コールバック関数の例
function CallBackTest(ID: DWord; Str: PChar; LP: LParam): bool; stdcall;
begin
TListBox(LP).Items.Addobject(Str,Pointer(ID));
Result := True;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
ListBox1.Items.Clear;
EnumProcesses95(@CallBackTest,Longint(ListBox1));
end;
|
|