2016-03-28 2 views
3

У меня есть небольшое консольное приложение, которое выводит одну строку. Когда я запускаю программу из экземпляра консоли, я могу видеть результат, потому что команда pormpt reappers после завершения программы. Но когда я запускаю программу из окна «Запустить» ([Win] + [R]), консольное окно мгновенно исчезает (потому что я не построил перерыв, и я не хочу строить разрыв, если он не является запускается по командной строке).Как определить, запущено ли консольное приложение из окна консоли?

Итак, как я могу определить, была ли запущена программа из командной строки или напрямую?

+4

Вы можете просто положить 'Console.ReadLine()' в конце вашей программы, так что вы можете прочитать вывод независимо от того, как он был запущен. Это приостановит программу, пока вы не нажмете Enter еще раз. –

+4

, который не нужен и раздражает, когда вы запускаете его из командной строки. – Paedow

+0

Попробуйте посмотреть [этот СОСТОЙЧИК] (http://stackoverflow.com/questions/17508093/determine-if-program-is-run-from-cmd- or-from-explorer) – Icemanind

ответ

4

Я не думаю, что есть встроенный способ узнать это. Однако я думаю, вы могли бы look up the parent process и использовать это как довольно хорошую эвристику. Быстрый тест показывает, что родительский процесс является «проводником» при запуске с Run (Win + R) или двойным щелчком. Вероятно, это будет cmd или powershell в любое другое время, кроме как при отладке в VS, тогда devenv будет родительским процессом. Очевидно, что если есть сценарии, в которых другие инструменты запускают экземпляр процесса, вы можете указать параметр командной строки для принудительного выполнения определенного поведения.

Вы код будет выглядеть примерно так:

// 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

Это именно то, что я искал, но я использую! ..., «cmd», ... чтобы соответствовать чему-либо, кроме cmd. Большое спасибо – Paedow

1

Я не думаю, что есть какой-либо способ программно определить, как было запущено консольное приложение.

Если вы хотите, чтобы приложение вело себя по-разному в этих разных ситуациях, я бы предложил использовать аргументы, например.

MyApp.exe /keepopen 

код:

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

Если вы хотите, чтобы консоль оставаться открытым при работе с Visual Studio, я полагаю, вы можете использовать Ctrl-F5, чтобы начать без отладки.

Смежные вопросы