2016-03-28 17 views
3

私は、1行を出力する小さなコンソールアプリケーションを持っています。コンソールインスタンス内からプログラムを実行すると、プログラムの完了後にコマンドpormptが再度読み込まれるため、結果を確認することができます。しかし、 "Run"ウィンドウ([Win] + [R])からプログラムを起動すると、コンソールウィンドウが即座に消えます(私は休憩には組み込まれていないので、コマンドラインで起動しました)。コンソールアプリケーションがコンソールウィンドウから起動したかどうかを確認する方法

したがって、プログラムがコマンドラインから起動されたか、直接起動されたかを確認するにはどうすればよいですか?

+4

あなたのコードは次のようになります。もう一度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)またはダブルクリックから起動すると、親プロセスが「エクスプローラ」であることが示されます。 VSでデバッグする場合を除いて、おそらくはcmdまたはpowershellになり、devenvは親プロセスになります。明らかに、他のツールがプロセスのインスタンスを開始するシナリオがある場合、特定の動作を強制するコマンドラインパラメータを与えることができます。 `あなたのプログラムの終了時にあなたは関係なく、それが実行されたかの出力を読み取ることができるので、あなただけの` Console.ReadLine()を置くことができる

// 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を使用することができると信じています。

関連する問題