2016-03-28 5 views
3

Ich habe eine kleine Konsolenanwendung, die eine einzelne Zeile ausgibt. Wenn ich das Programm innerhalb einer Konsoleninstanz ausführe, kann ich das Ergebnis sehen, weil der Befehl pormpt nach Abschluss des Programms neu erstellt wird. Aber wenn ich das Programm über das "Ausführen" -Fenster ([Win] + [R]) starte, verschwindet das Konsolenfenster sofort (weil ich keine Pause eingebaut habe und ich keine Pause einbauen will, wenn es nicht ist 't wurde von der Kommandozeile gestartet.Wie kann festgestellt werden, ob eine Konsolenanwendung in einem Konsolenfenster gestartet wurde?

Also wie kann ich feststellen, ob das Programm von einer Befehlszeile oder direkt gestartet wurde?

+4

Sie können nur setzen 'Console.ReadLine();' am Ende des Programms, so dass Sie die Ausgabe unabhängig von lesen kann, wie es ausgeführt wurde. Es wird das Programm anhalten, bis Sie noch einmal Enter drücken. –

+4

was unnötig und ärgerlich ist, wenn Sie es von der Kommandozeile starten – Paedow

+0

Versuchen Sie, [diese Frage SO] (http://stackoverflow.com/questions/17508093/determine-if-program-is-run-from-cmd- or-from-explorer) – Icemanind

Antwort

4

Ich glaube nicht, dass es eine eingebaute Möglichkeit, dies herauszufinden. Aber ich denke, Sie könnten look up the parent process und das als ziemlich gute Heuristik verwenden. Ein schneller Test zeigt, dass der Elternprozess "Explorer" ist, wenn er von Run (Win + R) oder Doppelklick gestartet wird. Es wäre wahrscheinlich cmd oder Powershell zu jeder anderen Zeit außer beim Debuggen in VS, dann Devenv wird der Elternprozess sein. Wenn es Szenarien gibt, in denen andere Tools eine Instanz des Prozesses starten, sollten Sie möglicherweise einen Befehlszeilenparameter angeben, um ein bestimmtes Verhalten zu erzwingen.

Sie Code würde wie folgt aussehen:

// Note: Adapted from Hans Passant's answer linked above. 
private static string GetParentProcessName() 
{ 
    var myId = Process.GetCurrentProcess().Id; 
    var query = string.Format("SELECT ParentProcessId FROM Win32_Process WHERE ProcessId = {0}", myId); 
    var search = new ManagementObjectSearcher("root\\CIMV2", query); 
    var queryObj = search.Get().OfType<ManagementBaseObject>().FirstOrDefault(); 
    if (queryObj == null) 
    { 
     return null; 
    } 
    var parentId = (uint)queryObj["ParentProcessId"]; 
    var parent = Process.GetProcessById((int)parentId); 
    return parent.ProcessName; 
} 

static void Main() 
{ 
    /* 
     Program code here. 
    */ 
    if (string.Equals(GetParentProcessName(), "explorer", StringComparison.InvariantCultureIgnoreCase)) 
    { 
     Console.ReadLine(); 
    } 
} 
+0

Genau das habe ich gesucht, aber ich benutze! ..., "cmd", ... um alles außer cmd zu finden. Danke vielmals – Paedow

1

Ich glaube nicht, dass es eine Möglichkeit gibt, programmgesteuert zu bestimmen, wie die Konsolenanwendung gestartet wurde.

Wenn Sie möchten, dass sich die Anwendung in diesen verschiedenen Situationen anders verhält, würde ich vorschlagen, Argumente zu verwenden, z.

MyApp.exe /keepopen 

Code:

static int Main(string[] args) 
{ 
    // Test if argument was supplied: 
    if (args.Any(a => a == "/keepopen")) 
    { 
     System.Console.ReadLine(); 
    } 
} 

Wenn Sie die Konsole wollen, offen bleiben, wenn sie von Visual Studio ausgeführt Ich glaube, Sie Ctrl-F5 verwenden können, ohne das Debuggen zu starten.

Verwandte Themen