Можно ли определить, какой процесс запускает мое приложение .Net?

StackOverflow https://stackoverflow.com/questions/53501

Вопрос

Я разрабатываю консольное приложение в .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 (используйте 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;
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top