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?

Était-ce utile?

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:

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

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;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top