2011-07-10 47 views
3

當我運行我的控制檯應用程序時,它顯示了一些我希望用戶看到的輸出。另外,我的程序必須在高架模式下運行。如何確定程序終止後是否關閉DOS控制檯

因此,當用戶從非提升的命令提示符運行它時,將顯示標準對話框,其中用戶接受將其升高運行。問題是爲此創建了一個新的控制檯窗口,並在程序終止後立即關閉。我希望它保持讓用戶讀取輸出。

很簡單吧?只需在代碼末尾添加Console.ReadLine()即可。但是,當從提升的提示符下運行時,不會創建新的控制檯,但用戶將不得不按下鍵來讓應用程序退出令人討厭的狀態。

我的問題:是否有可能知道在應用程序終止時控制檯窗口將被關閉,以便我可以僅僅在Console.ReadLine()之前?

謝謝。

+0

如果用戶通過在資源管理器中右鍵單擊並選擇「以管理員身份運行」來運行應用程序,也可能會出現這種情況。所以不僅僅當從另一個控制檯創建一個新的控制檯時,也有這個路徑。提到它是因爲運行時環境稍有不同(控制檯不會有另一個控制檯作爲其父環境)。 –

+0

謝謝你添加這個。當然,你是對的。 – mark

回答

2

你需要一些小的調整來發現這一點。 GetConsoleProcessList()api函數返回連接到控制檯的進程列表。如果您的程序從另一個進程繼承了控制檯,那將會超過1個。使其看起來類似於:

using System; 
using System.Runtime.InteropServices; 

namespace ConsoleApplication1 { 
    class Program { 
     static void Main(string[] args) { 
      if (OwnsConsole()) { 
       Console.Write("Press ENTER to exit"); 
       Console.ReadLine(); 
      } 
     } 
     public static bool OwnsConsole() { 
      int[] pids = new int[1]; // NOTE: intentionally too short 
      int retval = GetConsoleProcessList(pids, pids.Length); 
      if (retval == 0) throw new System.ComponentModel.Win32Exception(); 
      return retval == 1; 
     } 
     [DllImport("kernel32.dll", SetLastError = true)] 
     private static extern int GetConsoleProcessList(int[] pids, int arraySize); 

    } 
} 
+0

非常感謝。正是我需要的。 – mark

+0

2017年依然不錯。謝謝! – Ben

相關問題