2010-08-20 5 views
4

Comment puis-je savoir si l'utilisateur a lancé l'application de console en double-cliquant sur le fichier EXE (ou un raccourci) ou si une fenêtre de ligne de commande était déjà ouverte et exécutée dans cette session?Comment pouvez-vous déterminer comment une application de console a été lancée?

+2

duplication possible de [Une application de console Win32 peut-elle détecter si elle a été exécutée à partir de l'explorateur ou non?] (Http://stackoverflow.com/questions/510805/can-a-win32-console-application-detect- si-it-has-been-run-de-la-explorateur ou non) – joshuapoehls

Répondre

1

Vous pourriez être en mesure de le comprendre par P/Appel à la fonction Win32 GetStartupInfo().

[DllImport("kernel32", CharSet=CharSet.Auto)] 
internal static extern void GetStartupInfo([In, Out] STARTUPINFO lpStartupInfo); 
7

bâton ce champ statique dans votre « Program » classe pour assurer qu'il fonctionne avant toute sortie:

static bool StartedFromGui = 
     !Console.IsOutputRedirected 
     && !Console.IsInputRedirected 
     && !Console.IsErrorRedirected 
     && Environment.UserInteractive 
     && Environment.CurrentDirectory == System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location) 
     && Console.CursorTop == 0 && Console.CursorLeft == 0 
     && Console.Title == Environment.GetCommandLineArgs()[0] 
     && Environment.GetCommandLineArgs()[0] == System.Reflection.Assembly.GetEntryAssembly().Location; 

Ceci est un peu overkill/paranoïaque, mais capte être démarré à partir de l'Explorateur sans répondre à des choses comme cls && app.exe (en vérifiant le chemin complet) ou même cls && "f:\ull\path\to\app.exe" (en regardant le titre). J'ai eu l'idée de win32 version of this question.

+0

J'ai ajouté un deuxième champ 'statique bool startedFromVisualStudio = \t \t \t \t! Console.IsOutputRedirected \t \t \t \t &&! Console.IsInputRedirected \t \t \t \t &&! Console.IsErrorRedirected \t \t \t \t && Environment.UserInteractive \t \t \t \t && Environment.CurrentDirectory == System.IO.Path.GetDirectoryName (System.Reflection.Assembly.GetEntryAssembly(). Situation) \t \t \t \t && Console.CursorTop == 0 && Console.CursorLeft == 0 \t \t \t \t && Environment.GetCommandLineArgs() [0] .Contains ("vshost"); 'pour attendre également une pression sur une touche à partir de VS – JCH2k

Questions connexes