当我运行我的控制台应用程序时,它会显示一些输出,我希望用户看到它。另外,我的程序必须以高架模式运行。
因此,当用户从非提升的命令提示符运行它时,将显示标准对话框,其中用户接受提升运行它。问题是为此创建了一个新的控制台窗口,并在程序终止后立即关闭。我想留下来让用户阅读输出。
简单,对吧?只需在代码末尾添加Console.ReadLine()
即可。但是,当从提升的提示符运行时,没有创建新的控制台,但用户必须按一个键让应用程序退出 - 这很烦人。
我的问题:是否有可能知道控制台窗口将在应用程序终止时关闭,这样我才可以执行Console.ReadLine()
?
感谢。
答案 0 :(得分:2)
你需要一些小的pinvoke才能发现这一点。 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);
}
}