タスクマネージャーのプロセス表示


TK  2023-09-06 23:27:00  No: 151081  IP: 192.*.*.*

タスクマネージャーのプロセスを確認すると、Delphiの場合、以下のような表示になると思います。
Embarcadero RAD Studio for Windows (32ビット)
 ├ Embarcadoro LSP Server for Delphi (32ビット)
 └ Embarcadoro RAD Studio for Windows (32ビット)

このようなプロセスの下に関連しているプロセスを纏めるにはどのようにすればよいのでしょうか。
大変お手数ですが、ご教授いただければ幸いです。

編集 削除
HFUKUSHI  2023-09-07 01:51:10  No: 151082  IP: 192.*.*.*

これはプロセスごとに割り当てられるプロセスID(PID)を元に親子関係を検出しています。
親プロセス(つまりそのプロセスを起動したプロセス)のPIDを知るには
1.CreateToolhelp32Snapshot/Process32First/Process32Nextを使う
2.NtQueryInformationProcessを使う
の2つの方法があるようです(WMIでも行ける?)

編集 削除
TK  2023-09-07 04:03:46  No: 151083  IP: 192.*.*.*

ご回答ありがとうございます。
PIDが関係していることを教えていただきありがとうございます。

私の方でアプリAを起動し、アプリAからアプリBを起動させております。
そのような場合、上記のようなプロセス関係でタスクマネージャーを表示したいのですが、アプリBを起動する際どのようにすればよいのでしょうか。
何度も質問し申し訳ありませんが、もう少しご教授いただければ幸いです。

編集 削除
HFUKUSHI  2023-09-07 05:21:38  No: 151084  IP: 192.*.*.*

プログラムの起動をプログラムA→プログラムBとしているのですね?AからBを起動するときにどのようにしていますか?CreateProcessですか?
あとプロセス間の親子関係はSysInternal ToolsのProcess Explorer https://learn.microsoft.com/en-us/sysinternals/downloads/process-explorer を使って、プロセスのプロパティのParentの表示でわかります。

編集 削除
mam  2023-09-08 02:14:07  No: 151085  IP: 192.*.*.*

私も知らなかったのですが(素人ですいません)、
タスクマネージャーが「まとめて」表示しているのは、親子プロセスだからではないんですね。
どのような場合に、タスクマネージャーが「まとめて」表示するのかは、正確には公開されていないそうです。

1つのパターンとして、親プロセスが子プロセスをデバッグする場合には「まとめて」表示されるみたいです。
CreateProcessAPIでフラグにDEBUG_ONLY_THIS_PROCESS 又は DEBUG_PROCESSを指定するとデバッグして子プロセスを起動できるのですが、
これだけでは子プロセスは停止状態で起動しますので、
WaitForDebugEvent
等を使わなくてはならず、かなり面倒なのですが、以下のような感じで「一応、タスクマネージャーでまとめて表示」できます。
答えになっていかもしれなくてごめんなさい。


procedure TForm1.Button3Click(Sender: TObject);
var SInfo : TStartupInfo;
    ProcInfo : TProcessInformation;
    FileName:String;
    pFileName:PChar;
    de:_DEBUG_EVENT;
    flag:boolean;
    dwContinueStatus:DWORD;
begin
  FileName:='notepad.exe';
  pFileName:=@FileName[1];
  ZeroMemory(@SInfo,SizeOf(SInfo));
  SInfo.dwFlags :=STARTF_USESHOWWINDOW;
  SInfo.wShowWindow := SW_SHOW;
  SInfo.cb := SizeOf(SInfo);

  CreateProcess(
   nil, pFileName,
   nil, nil, False,
   NORMAL_PRIORITY_CLASS or DEBUG_ONLY_THIS_PROCESS, //←ココ
   nil, nil,
   SInfo, ProcInfo
  );

  dwContinueStatus := DBG_CONTINUE;
  flag:=true;
  while flag do
  begin
    WaitForDebugEvent(de,INFINITE);
    case de.dwDebugEventCode of
      EXIT_PROCESS_DEBUG_EVENT:
      begin
        dwContinueStatus:=DBG_TERMINATE_PROCESS;
        flag:=False;
      end;
    end;
   ContinueDebugEvent(de.dwProcessId,
                      de.dwThreadId,
                      dwContinueStatus);
  end;
end;


編集 削除
TK  2023-09-08 09:17:52  No: 151086  IP: 192.*.*.*

HFUKUSHIさん
ご回答ありがとうございます。
自分が作成したexeをタスクマネージャーで表示した際、Delphiのようにしたかっただけなので、関係を知りたいわけではありません。
私の質問の仕方がよくなく申し訳ありませんでした。

mamさん
コードまでありがとうございます。
Debugを使用すると可能とのことですが、Delphiはこの手法で実現していないような気がします。
Delphiはどのようにして実現しているのでしょうね。。

編集 削除
HFUKUSHI  2023-09-08 13:33:24  No: 151087  IP: 192.*.*.*

ああ、確かにタスクマネージャの表示は単純なプロセスの親子関係ではなさそうですね。
試してはいませんが、こういう記事がありました。

windows - Is there any way to let a child process be listed under its parent process in Task Manager? - Stack Overflow
https://stackoverflow.com/questions/73161170/is-there-any-way-to-let-a-child-process-be-listed-under-its-parent-process-in-ta

AppUserModelIDを明示的に(同じに)指定することでいけるかもしれません。

Delphi 2010 で探る! Windows 7 新機能
https://community.embarcadero.com/images/40256/b6.pdf

編集 削除
TK  2023-09-15 02:27:16  No: 151098  IP: 192.*.*.*

HFUKUSHIさん、ご回答ありがとうございます。

Delphi D11.3でアプリA及びBを作成しアプリAからBを起動すると、希望するような表示となりました。
今までDelphi D11.3で作成したアプリAから、Delphi.NETで作成したアプリBを起動しており、タスクマネージャーで希望するような並びになっておりませんでした。
Delphi.NETで作成したアプリでは、希望するような表示は無理なのでしょうか。。。

編集 削除