Что входит в решение, запускается ли процесс в той же консоли, BESIDES UseShellExecute = false - PullRequest
0 голосов
/ 24 апреля 2019

Глядя на Запуск процесса на той же консоли , как и на других ресурсах, похоже, единственное, что вам нужно сделать, чтобы запустить процесс в той же консоли, что и текущий процесс.установить 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());

Однако я все еще не вижу, чтобы консоль наследовалась дочерним процессом.

...