在Main中启动新构建时关闭控制台窗口

时间:2016-04-25 19:34:42

标签: c#

在我的控制台应用程序的主要部分中,如果用户请求提升它,我正在运行应用程序的升级版本。

代码正在执行此操作

elevated.exe myexe.exe //a /elevated

此代码正在main中运行,因此当myexe运行时会发生什么,它会打开一个控制台窗口,点击下面的代码并使用新实例创建另一个控制台窗口。

如何在不关闭新窗口的情况下以编程方式关闭初始窗口?

Environment.Exit(0) //closes the entire application THIS WONT WORK

在这里输入代码

 public void Run(string[] args) //myexe.exe
        {

        if (args[0] == "/elevated")
        {
            _command.RunElevated(path, arguments); 
            return;
        }
    }

以下是RunElevated代码非常标准的内容..

var process = new Process();
        if (workingDirectory != null) process.StartInfo.WorkingDirectory = workingDirectory;
        process.StartInfo.UseShellExecute = false;
        process.StartInfo.RedirectStandardOutput = true;
        process.StartInfo.RedirectStandardError = true;
        process.StartInfo.CreateNoWindow = true;
        process.StartInfo.FileName = fileName;
        process.StartInfo.Arguments = arguments;
        process.Start();

        // deal with output
        standardOutput = process.StandardOutput.ReadToEnd();
        standardError = process.StandardError.ReadToEnd();

        // wait til the process exits
        process.WaitForExit();

        int exitCode = process.ExitCode;

1 个答案:

答案 0 :(得分:1)

好吧也许我知道现在发生了什么。当您使用UseShellExecute = false时,程序将在同一个命令窗口中运行,您将使用Environment.Exit(0)关闭该命令窗口。

所以改为:

   var process = new Process();
    if (workingDirectory != null) process.StartInfo.WorkingDirectory = workingDirectory;
    process.StartInfo.UseShellExecute = true;
    process.StartInfo.CreateNoWindow = true;
    process.StartInfo.FileName = fileName;
    process.StartInfo.Arguments = arguments;
    process.Start();

不要重定向输出,因为1)您不能使用UseShellExecute=true,2)您正在关闭主应用程序,所以为什么要将内容重定向到几毫秒内退出的应用程序。

通过这些更改,您可以在自己的隐藏窗口中生成应用程序,然后只需Environment.Exit(0)您的主要应用程序,这将杀死未提升的应用程序,但不会触及您生成的进程。

这是一个完全有效的例子:

using System;
using System.Diagnostics;

namespace ConsoleApplication4
{
class Program
{
    static void Main(string[] args)
    {
        if (args.Length > 0 && args[0] == "/elevated")
        {
            var process = new Process();
            /*process.StartInfo.WorkingDirectory = */
            process.StartInfo.UseShellExecute = true;
            process.StartInfo.CreateNoWindow = false;
            process.StartInfo.FileName = "ConsoleApplication4.exe";
            process.StartInfo.Arguments = "startedThroughElevatedCodePath";
            process.Start();
            Environment.Exit(0);
        }

        if (args.Length > 0 && args[0] == "startedThroughElevatedCodePath")
        {
            Console.WriteLine("Hello from elevated");
        }
        else
        {
            Console.WriteLine("Hello from not elevated");
        }

        Console.Read();
    }
}
}