Можно ли определить, какой процесс запускает мое приложение .Net? - PullRequest
8 голосов
/ 10 сентября 2008

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

Ответы [ 3 ]

9 голосов
/ 10 сентября 2008
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;
3 голосов
/ 10 сентября 2008

Одна проблема с подходами 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;
}
3 голосов
/ 10 сентября 2008

Функция CreateToolhelp32Snapshot имеет метод Process32First, который позволит вам прочитать структуру PROCESSENTRY32 . Структура имеет свойство, которое даст вам необходимую информацию:

th32ParentProcessID - идентификатор процесса, который создал это процесс (его родительский процесс).

Эта статья поможет вам начать использовать функцию ToolHelpSnapshot:

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

...