Можно ли определить, какой процесс запускает мое приложение.Net?
Я разрабатываю консольное приложение в.Net и хочу немного изменить поведение, основываясь на информации о том, что приложение было запущено из cmd.exe или из explorer.exe. Является ли это возможным?
3 ответа
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 (используйте PInvoke, если нет эквивалента.NET) заполняет структуру, которая включает заголовок окна. Для консольного приложения Win32 "app.exe" эта строка заголовка "app" при запуске из cmd и "c:\full\path\to\app.exe" при запуске из проводника (или отладчика VS).
Конечно, это взлом (может быть изменен в других версиях и т. Д.).
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
int main()
{
STARTUPINFO si;
GetStartupInfo(&si);
MessageBox(NULL, si.lpTitle, NULL, MB_OK);
return 0;
}
Функция CreateToolhelp32Snapshot имеет метод Process32First, который позволит вам читать структуру PROCESSENTRY32. Структура имеет свойство, которое даст вам необходимую информацию:
th32ParentProcessID - Идентификатор процесса, который создал этот процесс (его родительский процесс).
Эта статья поможет вам начать использовать функцию ToolHelpSnapshot: