Можно ли определить, какой процесс начинается my.Net заявление?


Я разрабатываю консольное приложение в .Net и хочу немного изменить поведение на основе информации о том, что приложение было запущено из cmd.exe или из проводника.exe. Возможно ли это?

3 8

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 функция:

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

Одна из проблем с подходами 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;
}