我想在已经运行的控制台内生成一个带有不同env变量(例如PATH或PROMPT)的控制台 。我还希望能够通过“退出”“退出”回原始控制台(这并不重要)。
下面的代码工作正常,但是会打开一个新的控制台窗口。
如果我删除FreeConsole()调用,则新控制台位于现有控制台中,但是每次按Enter键后,我都会回到父控制台中(它在两个控制台之间来回切换)。
类似这样的东西:
CHILD_CONSOLE
D:\dev\>
CHILD_CONSOLE
D:\dev\>
CHILD_CONSOLE
...
AttachConsole()和AllocConsole()也不起作用。
我可能可以模拟控制台并来回传递输入/输出流,但这似乎很复杂...
[DllImport("kernel32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool AllocConsole();
[DllImport("kernel32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool FreeConsole();
[DllImport("kernel32", SetLastError = true)]
static extern bool AttachConsole(int dwProcessId);
// ...
public void SpawnConsole()
{
Process process = new Process();
process.StartInfo.FileName = "cmd.exe ";
process.StartInfo.UseShellExecute = false;
process.StartInfo.EnvironmentVariables["PROMPT"] = "CHILD_CONSOLE ";
// set some more env variable on process...
FreeConsole();
process.Start();
}
使用最少的演示应用程序更新了问题:
using System.Diagnostics;
using System.Runtime.InteropServices;
namespace Demo
{
class Program
{
[DllImport("kernel32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool FreeConsole();
static void Main(string[] args)
{
Process process = new Process();
process.StartInfo.FileName = "cmd.exe ";
process.StartInfo.UseShellExecute = false;
process.StartInfo.EnvironmentVariables["PROMPT"] = "CHILD_CONSOLE ";
// Works with this, but then a new prompt window is openend
// FreeConsole();
process.Start();
}
}
}