如何在多个同名进程运行时终止指定的单个C#进程?
仅终止指定同名进程实例的解决方案
你的代码会遍历所有同名进程并全部终止,核心问题是缺少区分application1实例的判断条件。要实现仅终止目标进程,需要找到该进程独有的标识特征,以下是几种可行的实现方式:
方法1:通过进程ID(PID)定位
如果你能获取到application1对应的进程ID(比如启动该进程时记录PID,或通过其他渠道获取),可直接根据PID定位并终止:
try { // 替换为application1的实际进程ID Process targetProcess = Process.GetProcessById(1234); targetProcess.Kill(); } catch (ArgumentException) { Console.WriteLine("目标进程不存在"); } catch (InvalidOperationException) { Console.WriteLine("无权限终止该进程"); }
方法2:通过窗口标题区分
如果application1有独特的窗口标题,可遍历进程时匹配窗口标题:
Process[] processes = Process.GetProcessesByName("name"); foreach (Process process in processes) { // 替换为application1的实际窗口标题,无窗口进程需跳过 if (!string.IsNullOrEmpty(process.MainWindowTitle) && process.MainWindowTitle == "application1专属标题") { process.Kill(); break; // 找到目标后立即退出循环,避免误杀其他进程 } }
方法3:通过命令行参数区分
若启动application1时带有独特命令行参数,可读取进程命令行信息匹配:
Process[] processes = Process.GetProcessesByName("name"); foreach (Process process in processes) { try { string commandLine = GetProcessCommandLine(process); // 替换为application1独有的命令行标识 if (commandLine.Contains("--instance=application1")) { process.Kill(); break; } } catch { // 无权限读取命令行时跳过该进程 continue; } } // 辅助方法:获取进程命令行参数 private static string GetProcessCommandLine(Process process) { using (var searcher = new ManagementObjectSearcher($"SELECT CommandLine FROM Win32_Process WHERE ProcessId = {process.Id}")) { foreach (var obj in searcher.Get()) { return obj["CommandLine"]?.ToString() ?? string.Empty; } } return string.Empty; }
注意:使用ManagementObjectSearcher需要添加对System.Management程序集的引用。
方法4:通过启动路径区分
如果application1的启动目录与其他实例不同,可匹配进程的启动路径:
Process[] processes = Process.GetProcessesByName("name"); foreach (Process process in processes) { try { string startPath = process.MainModule.FileName; // 替换为application1的实际启动路径 if (startPath.Equals(@"C:\Apps\Application1\name.exe", StringComparison.OrdinalIgnoreCase)) { process.Kill(); break; } } catch (InvalidOperationException) { // 无权限访问主模块时跳过 continue; } }
原代码逻辑修正
你的原代码中Process.GetProcessesByName("MAPPOINT")与后续prs.ProcessName.ToUpper() == "NAME"逻辑矛盾,应统一为Process.GetProcessesByName("name"),减少不必要的遍历操作。
内容的提问来源于stack exchange,提问作者Sirena
相关产品推荐
相关产品推荐

