Pregunta

Estoy desarrollando una aplicación de consola en .Net y quiero cambiar un poco el comportamiento según la información de que la aplicación se inició desde cmd.exe o explorer.exe.¿Es posible?

¿Fue útil?

Solución

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;

Otros consejos

El Función CreateToolhelp32Snapshot tiene un método Process32First que le permitirá leer un PROCESSENTRY32 Estructura.La estructura tiene una propiedad que le brindará la información que desea:

th32ParentProcessID - El identificador del proceso que creó este proceso (su proceso principal).

Este artículo le ayudará a empezar a utilizar la función ToolHelpSnapshot:

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

Un problema con los enfoques ToolHelp/ManagementObject es que es posible que el proceso principal ya haya salido.

La función GetStartupInfo Win32 (use PInvoke si no hay un equivalente .NET) completa una estructura que incluye el título de la ventana.Para una aplicación de consola Win32 "app.exe", esta cadena de título es "app" cuando se inicia desde cmd y "c:\full\path o\app.exe" cuando se inicia desde el explorador (o el depurador VS).

Por supuesto, esto es un truco (sujeto a cambios en otras versiones, 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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top