Domanda

Sto sviluppando un applicazione console .Net e ho voglia di cambiare un comportamento un po ' in base alle informazioni che l'applicazione è stata avviata dalla cmd.exe o da explorer.exe.È possibile?

È stato utile?

Soluzione

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;

Altri suggerimenti

Il CreateToolhelp32Snapshot Funzione ha un Process32First metodo che vi permetterà di leggere un Struttura PROCESSENTRY32.La struttura dispone di una proprietà che si ottiene le informazioni che si desidera:

th32ParentProcessID - L'identificatore del processo che ha creato questo processo (il suo processo padre).

Questo articolo vi aiuterà a iniziare a utilizzare il ToolHelpSnapshot funzione:

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

Un problema con il ToolHelp/ManagementObject approcci è che il processo padre era già uscito.

Il GetStartupInfo funzione Win32 (uso PInvoke se non c'è .Equivalente NETTO) riempie una struttura che include il titolo della finestra.Per un'applicazione console Win32 "app.exe" questo titolo la stringa "app" quando iniziato da cmd e "c:\full\path o\app.exe" quando è iniziato da explorer (o il VS debugger).

Naturalmente questo è un hack (soggette a variazione in altre versioni, etc.).

#define WIN32_LEAN_AND_MEAN
#include <windows.h>
int main()
{
  STARTUPINFO si;
  GetStartupInfo(&si);
  MessageBox(NULL, si.lpTitle, NULL, MB_OK);
  return 0;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top