【问题标题】:How to get process id of Console in C# console app如何在 C# 控制台应用程序中获取控制台的进程 ID
【发布时间】:2015-06-21 20:47:00
【问题描述】:

在我的 hello world 控制台应用程序中,Process.GetCurrentProcess().Id 属性返回与 Id 不同的值,用于创建用于显示应用程序的标准输出等的 Console 窗口。

我如何专门获取控制台窗口的进程 ID?

我循环浏览Process.GetProcesses() 中的进程并根据窗口标题检查控制台窗口。当它找到它时,我将它的进程 ID 打印出来,它与 GetCurrentProcess() 调用返回的不同。所以我得出结论,控制台应用程序进程和控制台窗口是两个不同的进程,也许控制台窗口是我的控制台应用程序的子进程,或者它可能是与在 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!!!
                    }
            }
        }

【问题讨论】:

  • 你能补充更多细节吗?我很难理解你的意思。
  • 为什么要关闭它?
  • 对我来说,仍然不清楚你真正想要什么。您是否开始了第二个过程?你的第一个过程是什么样的?你为什么要找 cmd.exe?可以写Minimal, Complete, and Verifiable example.吗?
  • 完成 - 我认为最好询问更多信息而不是关闭问题。有时我认为这里的游戏化真的无助于对话。
  • 我正在寻找 cmd.exe,因为这是 Windows 控制台应用程序的默认标题。

标签: c# process console-application managed pid


【解决方案1】:

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

在 Visual Studio 中,使用调试运行:

这将使您的应用程序在单个进程中运行。 MainWindowTitle 将类似于以下内容:

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

在 Visual Studio 中,无需调试即可运行:

这将启动cmd.exe 并启动您的应用程序。因此,您的应用程序将是与 cmd.exe 分开的进程,并且没有MainWindowTitle(因为它没有窗口)。您可以在 Process Explorer 中看到作为 cmd.exe 的子进程运行的进程:

没有 Visual Studio:

双击应用程序的 exe 时,您将获得一个进程,其 MainWindowTitle 将是您的 exe 的路径(因此与第一种情况相同,但没有 file://)。如果您在项目的调试选项中取消选中“启用 Visual Studio 托管进程”,您也可以在使用 VS 进行调试时让它像这样运行。

没有 Visual Studio,使用命令行

这将为您提供与 VS 的“无需调试即可运行”选项完全相同的结果。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-18
    • 1970-01-01
    • 1970-01-01
    • 2012-06-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多