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

C#中Process.MainWindowTitle返回进程名而非控制台窗口标题问题求助

解决根据控制台窗口标题关闭进程的问题

首先,咱们先搞清楚你遇到的问题根源:你说C#代码返回的是进程名而非设置的窗口标题,大概率是你在代码里错误访问了Process.ProcessName属性,而不是获取窗口标题的Process.MainWindowTitle。不过咱们也得先确认C程序那边的SetConsoleTitle调用是正确的。

第一步:确保C程序的窗口标题设置正确

在你的C程序里,要确保SetConsoleTitle是在程序启动后立刻调用的,而且没有后续代码覆盖这个标题。比如正确的写法应该是这样:

#include <windows.h>
#include <stdio.h>

int main() {
    // 启动后马上设置窗口标题
    if (!SetConsoleTitleA("staticEngineWriter")) {
        printf("设置窗口标题失败,错误码:%d\n", GetLastError());
        return 1;
    }

    // 你的业务逻辑代码
    printf("程序运行中...\n");
    // 保持程序运行,方便测试
    getchar();
    return 0;
}

这里要注意用SetConsoleTitleA(ANSI版本)还是SetConsoleTitleW(宽字符版本),根据你的项目编码来选,避免标题出现乱码。

第二步:正确的C#实现代码

下面是可以根据窗口标题关闭目标控制台程序的C#代码,核心是遍历所有进程,检查MainWindowTitle是否匹配,而不是用ProcessName:

using System;
using System.Diagnostics;
using System.Linq;

class ConsoleProcessKiller
{
    static void Main(string[] args)
    {
        const string TargetWindowTitle = "staticEngineWriter";

        // 获取所有主窗口标题匹配的进程
        var targetProcesses = Process.GetProcesses()
            .Where(p => !string.IsNullOrEmpty(p.MainWindowTitle) && 
                        p.MainWindowTitle.Equals(TargetWindowTitle, StringComparison.OrdinalIgnoreCase))
            .ToList();

        if (!targetProcesses.Any())
        {
            Console.WriteLine($"没有找到标题为「{TargetWindowTitle}」的进程");
            return;
        }

        foreach (var process in targetProcesses)
        {
            try
            {
                Console.WriteLine($"找到进程:{process.ProcessName} (PID: {process.Id})");
                
                // 先尝试优雅关闭(发送关闭窗口的消息)
                if (process.CloseMainWindow())
                {
                    // 等待进程退出,最多5秒
                    if (process.WaitForExit(5000))
                    {
                        Console.WriteLine($"进程 {process.Id} 已优雅退出");
                    }
                    else
                    {
                        // 超时则强制终止
                        process.Kill();
                        Console.WriteLine($"进程 {process.Id} 已强制终止");
                    }
                }
                else
                {
                    // 无法优雅关闭,直接强制终止
                    process.Kill();
                    Console.WriteLine($"进程 {process.Id} 已强制终止");
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine($"处理进程 {process.Id} 时出错:{ex.Message}");
            }
            finally
            {
                // 释放进程资源
                process.Dispose();
            }
        }
    }
}

关键注意事项

  • 权限问题:如果目标C程序是用管理员权限启动的,你的C#程序也需要以管理员身份运行,否则会出现权限不足的错误。
  • 标题匹配逻辑:如果你的C程序窗口标题有动态内容(比如包含PID或时间戳),可以把Equals改成Contains,或者用正则表达式来匹配。
  • 避免误杀:如果有多个进程用了相同的窗口标题,这个代码会关闭所有匹配的进程,所以确保标题是唯一的。
  • 优雅关闭优先:尽量用CloseMainWindow而不是直接Kill,这样目标程序有机会执行清理工作(比如保存文件)。

为什么之前拿到的是进程名?

你提到代码返回的是进程名,应该是之前的代码里错误地使用了process.ProcessName(比如Console.WriteLine(process.ProcessName)),这个属性返回的是进程的可执行文件名(不带.exe后缀),而不是窗口标题。你需要的是process.MainWindowTitle,这才是SetConsoleTitle设置的窗口标题。

内容的提问来源于stack exchange,提问作者Jason

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:51:34