如何通过ManagementClass让进程后台运行而非显示UI控制台
解决使用ManagementClass创建进程时控制台窗口显示的问题
你当前的代码问题在于:虽然创建了Win32_ProcessStartup对象并设置了DETACHED_PROCESS标志,但并没有将这个启动配置传递给Win32_Process.Create方法,导致你的窗口隐藏设置完全没有生效,控制台窗口依然会弹出。
要实现后台运行,需要把配置好的Win32_ProcessStartup对象作为参数传入Create方法的参数数组中,同时可以结合CREATE_NO_WINDOW标志(值为0x08000000)来更彻底地隐藏控制台窗口。
修改后的完整代码如下:
public uint LaunchProcess(string sIPAddress, string sPort) { uint iPid = 0; try { logger.AddLog("LaunchProcess : " + sIPAddress + " " + sPort); string processPath = $"{StaticUtils.GetLocation(AgilentPluginCommonConstants.PlugInRunnerPath)}\\PlugInRunner.exe {sIPAddress} {sPort}"; using (var mgmtProcessClass = new ManagementClass("Win32_Process")) { // 创建并配置进程启动信息 using (var startupInfo = new ManagementClass("Win32_ProcessStartup")) { // 组合DETACHED_PROCESS和CREATE_NO_WINDOW标志,彻底隐藏控制台窗口 startupInfo.Properties["CreateFlags"].Value = 0x00000008 | 0x08000000; startupInfo.Properties["ShowWindow"].Value = 0; // SW_HIDE,进一步确保窗口不显示 // 构造Create方法的参数:命令行、工作目录、启动信息、进程ID object[] processParams = { processPath, null, startupInfo, 0 }; var result = mgmtProcessClass.InvokeMethod("Create", processParams); if (result != null) { logger.AddLog("Process id " + Convert.ToUInt32(processParams[3])); iPid = Convert.ToUInt32(processParams[3]); } } } } catch (Exception ex) { logger.AddLog("Exception " + ex.Message); } return iPid; }
关键修改点说明:
- 将配置好的
startupInfo对象作为第三个参数传入Create方法的参数数组,让启动配置生效 - 同时设置
ShowWindow为0(SW_HIDE),双重保障窗口不显示 - 用位或操作组合
DETACHED_PROCESS和CREATE_NO_WINDOW标志,覆盖更多场景下的窗口隐藏需求
内容的提问来源于stack exchange,提问作者destroyer
相关产品推荐
相关产品推荐

