8

.Netでコンソールアプリケーションを開発していますが、アプリケーションがcmd.exeまたはexplorer.exeから起動されたという情報に基づいて、動作を少し変更したいと思います。出来ますか?

4

3 に答える 3

9
Process this_process = Process.GetCurrentProcess();
int parent_pid = 0;
using (ManagementObject MgmtObj = new ManagementObject("win32_process.handle='" + this_process.Id.ToString() + "'"))
{
    MgmtObj.Get();
    parent_pid = Convert.ToInt32(MgmtObj["ParentProcessId"]);
}
string parent_process_name = Process.GetProcessById(parent_pid).ProcessName;
于 2008-09-10T06:32:40.160 に答える
3

CreateToolhelp32Snapshot関数には、 PROCESSENTRY32構造を読み取ることができるProcess32Firstメソッドがあります。構造には、必要な情報を取得するプロパティがあります。

th32ParentProcessID-このプロセスを作成したプロセス(その親プロセス)の識別子。

この記事は、ToolHelpSnapshot関数の使用を開始するのに役立ちます。

http://www.codeproject.com/KB/cs/IsApplicationRunning.aspx

于 2008-09-10T06:16:00.980 に答える
3

ToolHelp/ManagementObject アプローチの 1 つの問題は、親プロセスが既に終了している可能性があることです。

GetStartupInfo Win32 関数 (.NET に相当するものがない場合は PInvoke を使用) は、ウィンドウ タイトルを含む構造を埋めます。Win32 コンソール アプリケーション "app.exe" の場合、このタイトル文字列は、cmd から起動すると "app" になり、エクスプローラー (または VS デバッガー) から起動すると "c:\full\path\to\app.exe" になります。

もちろん、これはハックです (他のバージョンなどで変更される可能性があります)。

#define WIN32_LEAN_AND_MEAN
#include <windows.h>
int main()
{
  STARTUPINFO si;
  GetStartupInfo(&si);
  MessageBox(NULL, si.lpTitle, NULL, MB_OK);
  return 0;
}
于 2008-09-10T07:40:43.630 に答える