Est-il possible de déterminer le processus commence mon .Net application?
-
09-06-2019 - |
Question
Je développe une application console dans .Net et j'ai envie de changer un comportement un peu basé sur les informations que l'application a été commencé à partir de cmd.exe ou de explorer.exe.Est-il possible?
La solution
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;
Autres conseils
L' CreateToolhelp32Snapshot Fonction a un process32first une seule méthode qui vous permettra de lire un Structure PROCESSENTRY32.La structure a une propriété qui vous permettra d'obtenir les informations que vous souhaitez:
th32ParentProcessID - L'identifiant le processus qui l'a créé processus (processus parent).
Cet article va vous aider à commencer à utiliser le ToolHelpSnapshot fonction:
Un problème avec le ToolHelp/ManagementObject approches est que le processus parent pourrait déjà avoir quitté.
Le GetStartupInfo fonction Win32 (utiliser PInvoke si il n'y a pas .NET équivalent) remplit une structure qui comprend le titre de la fenêtre.Pour une application console Win32 "app.exe", le titre de cette chaîne est "app" lorsqu'il est démarré à partir de cmd et "c:\full\path o\app.exe" lorsqu'il est démarré à partir de l'explorateur (ou le VS débogueur).
Bien sûr, c'est un hack (sous réserve de changement dans d'autres versions, etc.).
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
int main()
{
STARTUPINFO si;
GetStartupInfo(&si);
MessageBox(NULL, si.lpTitle, NULL, MB_OK);
return 0;
}