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函数有一个 Process32First 方法,可让您读取PROCESSENTRY32 结构。该结构具有一个属性,可以为您提供所需的信息:

th32ParentProcessID - 创建此进程(其父进程)的进程的标识符。

本文将帮助您开始使用 ToolHelpSnapshot 功能:

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

于 2008-09-10T06:16:00.980 回答
3

ToolHelp/ManagementObject 方法的一个问题是父进程可能已经退出。

GetStartupInfo Win32 函数(如果没有 .NET 等效函数,则使用 PInvoke)填充包含窗口标题的结构。对于 Win32 控制台应用程序“app.exe”,此标题字符串在从 cmd 启动时为“app”,从资源管理器(或 VS 调试器)启动时为“c:\full\path\to\app.exe”。

当然,这是一个 hack(可能会在其他版本中发生变化等)。

#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 回答