如何在 C# 控制台应用程序中获取控制台的进程 ID

How to get process id of Console in C# console app

在我的 hello world 控制台应用程序中,Process.GetCurrentProcess().Id 属性 returns 为 Console window 创建了一个与 Id 不同的值显示应用程序的标准输出等

如何获取控制台 window 的进程 ID?

我循环执行 Process.GetProcesses() 中的进程并根据 window 标题检查控制台 window。当它找到它时,我打印出它的进程 ID,它与 GetCurrentProcess() 调用返回的不同。所以我得出结论,控制台应用程序进程和控制台 window 是两个不同的进程,也许控制台 window 是我的控制台应用程序的 child 进程,或者它可能是与运行 来自 Visual Studio.

的控制台应用程序
        Process[] processlist = Process.GetProcesses();
        int origProcessId = Process.GetCurrentProcess().Id;
        foreach ( Process p in processlist)
        {
            // get all window handles of title 'C:\Windows\system32\cmd.exe
            if (!String.IsNullOrEmpty(p.MainWindowTitle) && p.MainWindowTitle.IndexOf("C:\Windows\system32\cmd.exe") == 0 )
            {
                    Console.WriteLine("Gets here ok, once & only once");
                    if(origProcessId == p.Id){
                                Console.WriteLine("Process: {0}", p.Id); // doesn't get here!!!
                    }
            }
        }

我认为了解为什么您需要进程 ID 对我们很有用。问题是您的应用程序可以通过多种方式启动,并且每一种方式看起来都略有不同:

在Visual Studio、运行中调试:

这将使您在单个进程中申请 运行。 MainWindowTitle 类似于以下内容:

file://C:\...\ConsoleApplication.exe

在Visual Studio,运行没有调试:

这将启动 cmd.exe 并启动您的应用程序。因此,您的应用程序将是一个独立于 cmd.exe 的进程,并且没有 MainWindowTitle(因为它没有 window)。您可以在 Process Explorer 中看到进程 运行ning 作为 cmd.exe 的子进程:

没有Visual Studio:

当双击您的应用程序的 exe 时,您将得到一个进程,其 MainWindowTitle 将是您的 exe 的路径(与第一种情况相同,但没有 file://).如果您在项目的调试选项中取消选中 "Enable the Visual Studio hosting process",则在使用 VS 调试时也可以像这样获得它 运行ning。

没有Visual Studio,使用命令行

这将为您提供与 VS 的 "Run without debugging" 选项完全相同的结果。

我认为这里的重要信息是:不要使用 MainWindowTitle 来查找您的应用程序。 Process.GetCurrentProcess() 将始终为您提供当前进程 ID。

如果出于某种原因,你想找到父进程,我建议查看 this question。我认为您应该澄清:为什么 需要查找进程 ID?你想用它做什么?