在现有控制台/cmd.exe中生成子控制台/cmd.exe,而没有新窗口

时间:2018-07-09 21:46:35

标签: c# cmd console console-application windows-console

我想在已经运行的控制台内生成一个带有不同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();
        }
    }
}

0 个答案:

没有答案