在我的控制台应用程序的主要部分中,如果用户请求提升它,我正在运行应用程序的升级版本。
代码正在执行此操作
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;
答案 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();
}
}
}