You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在多个同名进程运行时终止指定的单个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 21:37:08