Можно ли определить, какой процесс начинается my.Net заявление?
Я разрабатываю консольное приложение в .Net и хочу немного изменить поведение на основе информации о том, что приложение было запущено из cmd.exe или из проводника.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;
ФункцияCreateToolhelp32Snapshot имеет метод Process32First, который позволит вам прочитать структуруPROCESSENTRY32 . Структура обладает свойством, которое даст вам нужную информацию:
Th32ParentProcessID - идентификатор о процессе, который создал это процесс (его родительский процесс).
Эта статья поможет вам начать использовать ToolHelpSnapshot функция:
Одна из проблем с подходами ToolHelp/ManagementObject заключается в том, что родительский процесс уже мог завершиться.
Функции GetStartupInfo для Win32 (использовать PInvoke, если нет .Чистый эквивалент) заполняет структуру, которая включает в себя заголовок окна. Для консольного приложения Win32 " приложение.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; }