是否可以确定哪个进程启动我的.Net应用程序?

时间:2008-09-10 06:04:13

标签: .net windows process-management

我正在.Net中开发控制台应用程序,我想根据应用程序从cmd.exe或explorer.exe启动的信息稍微改变一下行为。有可能吗?

3 个答案:

答案 0 :(得分: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;

答案 1 :(得分:3)

CreateToolhelp32Snapshot Function有一个Process32First方法,可让您阅读PROCESSENTRY32 Structure。该结构具有一个属性,可以获得您想要的信息:

  

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

本文将帮助您开始使用ToolHelpSnapshot函数:

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

答案 2 :(得分:3)

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

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;
}