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

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

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; 

CreateToolhelp32Snapshot函数有一个Process32First方法,将允许您读取一个PROCESSENTRY32结构 。 该结构有一个属性,将得到你想要的信息:

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

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

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

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

GetStartupInfo Win32函数(如果没有.NET等价物,使用PInvoke)填充包含窗口标题的结构。 对于Win32控制台应用程序“app.exe”,当从cmd启动时,该标题字符串是“app”,从explorer(或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; }