Можно ли определить, какой процесс запускает мое приложение .Net?
-
09-06-2019 - |
Вопрос
Я разрабатываю консольное приложение в .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:
Одна из проблем с подходами ToolHelp / ManagementObject заключается в том, что родительский процесс, возможно, уже завершился.
Функция GetStartupInfo Win32 (используйте PInvoke, если ее нет.СЕТЕВОЙ эквивалент) заполняет структуру, которая включает заголовок окна.Для консольного приложения Win32 "app.exe" эта строка заголовка является "app" при запуске из cmd и "c:\full\path o\app.exe" при запуске из explorer (или VS debugger).
Конечно, это взлом (может быть изменен в других версиях и т.д.).
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
int main()
{
STARTUPINFO si;
GetStartupInfo(&si);
MessageBox(NULL, si.lpTitle, NULL, MB_OK);
return 0;
}