private void StartProcess() { bool retValue; // Create startup info for new console process. STARTUPINFO startupInfo = new STARTUPINFO(); startupInfo.cb = Marshal.SizeOf(startupInfo); startupInfo.dwFlags = StartFlags.STARTF_USESHOWWINDOW; startupInfo.wShowWindow = _consoleVisible ? WindowShowStyle.Show : WindowShowStyle.Hide; startupInfo.lpTitle = this.ConsoleTitle ?? "Console"; SECURITY_ATTRIBUTES procAttrs = new SECURITY_ATTRIBUTES(); SECURITY_ATTRIBUTES threadAttrs = new SECURITY_ATTRIBUTES(); procAttrs.nLength = Marshal.SizeOf(procAttrs); threadAttrs.nLength = Marshal.SizeOf(threadAttrs); // Set environment variables for new process. IntPtr pEnvironment = IntPtr.Zero; // Start new console process. retValue = WinApi.CreateProcess(null, this.CommandLine, ref procAttrs, ref threadAttrs, false, CreationFlags.CREATE_NEW_CONSOLE | CreationFlags.CREATE_SUSPENDED, pEnvironment, null, ref startupInfo, out _procInfo); if (!retValue) throw new Win32Exception(Marshal.GetLastWin32Error(), "Unable to create new console process."); _proc = Process.GetProcessById(_procInfo.dwProcessId); // Create objects in shared memory. CreateSharedObjects(_procInfo.dwProcessId); // Write startup parameters to shared memory. unsafe { ConsoleParams* consoleParams = (ConsoleParams*)_consoleParams.Get(); consoleParams->ConsoleMainThreadId = _procInfo.dwThreadId; consoleParams->ParentProcessId = Process.GetCurrentProcess().Id; consoleParams->NotificationTimeout = 10; consoleParams->RefreshInterval = 100; consoleParams->Rows = this.ConsoleInitialWindowHeight; consoleParams->Columns = this.ConsoleInitialWindowWidth; consoleParams->BufferRows = this.ConsoleInitialBufferHeight; consoleParams->BufferColumns = this.ConsoleInitialBufferWidth; } }
public static extern bool CreateProcess(string lpApplicationName, string lpCommandLine, ref SECURITY_ATTRIBUTES lpProcessAttributes, ref SECURITY_ATTRIBUTES lpThreadAttributes, bool bInheritHandles, CreationFlags dwCreationFlags, IntPtr lpEnvironment, string lpCurrentDirectory, [In] ref STARTUPINFO lpStartupInfo, out PROCESS_INFORMATION lpProcessInformation);