É possível determinar qual processo inicia meu aplicativo .Net?
-
09-06-2019 - |
Pergunta
Estou desenvolvendo um aplicativo de console em .Net e quero mudar um pouco o comportamento com base nas informações de que o aplicativo foi iniciado a partir do cmd.exe ou do explorer.exe.É possível?
Solução
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;
Outras dicas
O Função CreateToolhelp32Snapshot tem um método Process32First que permitirá que você leia um Estrutura PROCESSENTRY32.A estrutura possui uma propriedade que lhe dará as informações que você deseja:
th32ParentProcessID - O identificador do processo que criou esse processo (seu processo pai).
Este artigo ajudará você a começar a usar a função ToolHelpSnapshot:
Um problema com as abordagens ToolHelp/ManagementObject é que o processo pai já pode ter sido encerrado.
A função GetStartupInfo Win32 (use PInvoke se não houver equivalente .NET) preenche uma estrutura que inclui o título da janela.Para um aplicativo de console Win32 "app.exe", esta sequência de título é "app" quando iniciada a partir do cmd e "c:\full\path o\app.exe" quando iniciada a partir do Explorer (ou do depurador VS).
Claro que isto é um hack (sujeito a alterações em outras versões, etc.).
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
int main()
{
STARTUPINFO si;
GetStartupInfo(&si);
MessageBox(NULL, si.lpTitle, NULL, MB_OK);
return 0;
}