2015-06-21 274 views
-1

在我的Hello World控制台应用程序,Process.GetCurrentProcess().Id属性创建显示Console窗口返回从Id不同的值应用程序的标准输出等如何获得控制台的进程id在C#控制台应用程序

如何获得特定于控制台窗口的进程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!!! 
        } 
      } 
     } 
+1

你能添加更多的细节吗?我很难理解你的意思。 – nvoigt

+0

为什么地球应该关闭? – user1561108

+0

对我而言,目前还不清楚你真正想要什么。你开始了第二个过程吗?你的第一个过程是什么样的?你为什么要找cmd.exe?你能写一个[最小,完整和可验证的例子。](http://stackoverflow.com/help/mcve)? – nvoigt

回答

2

我认为这将是有益的,我们不清楚为什么需要的进程ID。问题是,有多种方法,你的应用程序可以启动和他们每个人看起来有点不同:

在Visual Studio中调试运行:

这会让你的应用程序运行在一个单一的过程。该MainWindowTitle将类似于以下内容:

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

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

这将启动cmd.exe还有启动应用程序。所以,你的应用程序将是一个独立于cmd.exe的进程,并且没有MainWindowTitle(因为它没有窗口)。你可以看到进程运行作为cmd.exe在Process Explorer的一个孩子:

enter image description here

没有的Visual Studio:

当双击应用程序的exe文件,你会得到一个进程的MainWindowTitle将成为您exe文件的路径(所以与第一种情况相同,但没有file://)。如果在项目的“调试”选项中取消选中“启用Visual Studio宿主进程”,您也可以在使用VS进行调试时使其像这样运行。

没有Visual Studio中,使用命令行

这会给你完全相同的结果为VS的“运行没有调试”选项。

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

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