내 .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;

다른 팁

그만큼 CreateToolhelp32스냅샷 기능 읽을 수 있는 Process32First 메서드가 있습니다. PROCESSENTRY32 구조.구조에는 원하는 정보를 얻을 수 있는 속성이 있습니다.

th32ParentProcessID -이 프로세스를 만든 프로세스의 식별자 (부모 ​​프로세스).

이 문서는 ToolHelpSnapshot 함수 사용을 시작하는 데 도움이 됩니다.

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

ToolHelp/ManagementObject 접근 방식의 한 가지 문제는 상위 프로세스가 이미 종료되었을 수 있다는 것입니다.

GetStartupInfo Win32 함수(.NET에 해당하는 것이 없는 경우 PInvoke 사용)는 창 제목을 포함하는 구조를 채웁니다.Win32 콘솔 응용 프로그램 "app.exe"의 경우 이 제목 문자열은 cmd에서 시작할 때 "app"이고 탐색기(또는 VS 디버거)에서 시작할 때 "c:\full\path o\app.exe"입니다.

물론 이것은 해킹입니다(다른 버전 등에서는 변경될 수 있음).

#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