Глядя на Запуск процесса на той же консоли , как и на других ресурсах, похоже, единственное, что вам нужно сделать, чтобы запустить процесс в той же консоли, что и текущий процесс.установить UseShellExecute
в false.
Однако я обнаружил, что это не всегда работает.Например, я создал тест NUnit и запустил его из visual studio:
[Test]
public void ConsoleTest()
{
var p = new System.Diagnostics.Process();
p.StartInfo = new System.Diagnostics.ProcessStartInfo(@"c:\windows\system32\netstat.exe", "-n")
{
UseShellExecute = false,
};
p.Start();
var hasSameConsole = HasSameConsole(p.Id);
Assert.IsFalse(p.HasExited, "process was still running when we did the console test");
Assert.IsTrue(hasSameConsole); // this fails
}
private static bool HasSameConsole(int processId)
{
uint processListCount = 1;
uint[] processIdListBuffer;
do
{
processIdListBuffer = new uint[processListCount];
processListCount = GetConsoleProcessList(processIdListBuffer, processListCount);
}
while (processListCount > processIdListBuffer.Length);
return processIdListBuffer.Take((int)processListCount)
.Contains(checked((uint)processId));
}
[DllImport("kernel32.dll", SetLastError = true)]
public static extern uint GetConsoleProcessList(uint[] lpdwProcessList, uint dwProcessCount);
В чем причина этого поведения?
РЕДАКТИРОВАТЬ:
Чтобы убедиться, что текущий процесс имеет консоль, я добавил:
[DllImport("kernel32.dll", SetLastError = true)]
prviate static extern bool AllocConsole();
...
// before starting the child process
Assert.IsTrue(AllocConsole());
Однако я все еще не вижу, чтобы консоль наследовалась дочерним процессом.