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?

Foi útil?

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:

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

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;
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top