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

时间:2020-03-05 18:50:33  来源:igfitidea点击:

我正在.Net中开发控制台应用程序,我想根据从cmd.exe或者explorer.exe启动该应用程序的信息来对行为进行一些更改。是否有可能?

解决方案

回答

CreateToolhelp32Snapshot函数具有Process32First方法,该方法使我们可以读取PROCESSENTRY32结构。该结构具有可为我们提供所需信息的属性:

th32ParentProcessID - The identifier
  of the process that created this
  process (its parent process).

本文将开始使用ToolHelpSnapshot函数:

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

回答

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;

回答

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