Delphi Tips 
-----------------------------

0212  D1   D2   D3   D4   D5   D6   D7   3.1   95   98    作成: 1999/08/23 西坂良幸 rev 1.1
   B1   B3   B4   B5   B6   B7   NT3   NT4   2K   XP  更新: 1999/08/23 西坂良幸 編集
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;

参照: [Delphi-ML:8519] [Delphi-ML:19427] <Windows>

[新規作成] [最新の情報に更新]

How To
Lounge
KeyWords


Tips
Delphi
Home
Osamu Takeuchi osamu@big.or.jp