.NET项目中如何让进程后台运行且不弹出控制台窗口?
解决.NET后台启动进程不弹出控制台窗口的问题
原代码问题分析
你当前使用WMI的Win32_Process启动进程,但未将配置好的Win32_ProcessStartup实例传入Create方法,导致设置的DETACHED_PROCESS标志未生效,控制台窗口仍会弹出。
方案一:修复WMI实现代码
将配置好的启动信息对象传入Create方法的参数数组,确保标志生效:
public uint LaunchProcess(string sIPAddress, string sPort) { uint iPid = 0; try { logger.AddLog("LaunchProcess : " + sIPAddress + " " + sPort); string exePath = Path.Combine(StaticUtils.GetLocation(AgilentPluginCommonConstants.PlugInRunnerPath), "PlugInRunner.exe"); string arguments = $"{sIPAddress} {sPort}"; using (var mgmtProcessClass = new ManagementClass("Win32_Process")) using (var startupInfo = new ManagementClass("Win32_ProcessStartup")) { // 设置DETACHED_PROCESS标志,避免弹出控制台 startupInfo.Properties["CreateFlags"].Value = 0x00000008; // 构建Create方法参数:命令行、工作目录、启动信息、进程ID object[] parameters = { $"{exePath} {arguments}", null, startupInfo, 0 }; var result = mgmtProcessClass.InvokeMethod("Create", parameters); if (result != null) { iPid = Convert.ToUInt32(parameters[3]); logger.AddLog("Process id " + iPid); } } } catch (Exception ex) { logger.AddLog("Exception " + ex.Message); } return iPid; }
方案二:使用System.Diagnostics.Process(更推荐)
相比WMI,Process类更直观易控,通过简单配置即可实现后台启动:
using System.Diagnostics; using System.IO; public uint LaunchProcess(string sIPAddress, string sPort) { uint iPid = 0; try { logger.AddLog("LaunchProcess : " + sIPAddress + " " + sPort); string exePath = Path.Combine(StaticUtils.GetLocation(AgilentPluginCommonConstants.PlugInRunnerPath), "PlugInRunner.exe"); var processStartInfo = new ProcessStartInfo { FileName = exePath, Arguments = $"{sIPAddress} {sPort}", // 禁止创建控制台窗口 CreateNoWindow = true, // 设置窗口为隐藏状态 WindowStyle = ProcessWindowStyle.Hidden, // 控制台程序需设为false,否则CreateNoWindow不生效 UseShellExecute = false }; using (var process = Process.Start(processStartInfo)) { if (process != null) { iPid = (uint)process.Id; logger.AddLog("Process id " + iPid); // 无需等待进程结束可注释此行 // process.WaitForExit(); } } } catch (Exception ex) { logger.AddLog("Exception " + ex.Message); } return iPid; }
关键参数说明
CreateNoWindow = true:阻止创建新的控制台窗口WindowStyle = ProcessWindowStyle.Hidden:强制窗口处于隐藏状态UseShellExecute = false:对控制台程序必须设置此值,才能让CreateNoWindow生效
内容的提问来源于stack exchange,提问作者destroyer
相关产品推荐
相关产品推荐

