如何获得控制台的进程id在C#控制台应用程序
在我的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!!!
}
}
}
我认为这将是有益的,我们不清楚为什么你需要的进程ID。问题是,有多种方法,你的应用程序可以启动和他们每个人看起来有点不同:
在Visual Studio中调试运行:
这会让你的应用程序运行在一个单一的过程。该MainWindowTitle
将类似于以下内容:
file://C:\...\ConsoleApplication.exe
在Visual Studio中,无需调试运行:
这将启动cmd.exe
还有启动应用程序。所以,你的应用程序将是一个独立于cmd.exe的进程,并且没有MainWindowTitle
(因为它没有窗口)。你可以看到进程运行作为cmd.exe
在Process Explorer的一个孩子:
没有的Visual Studio:
当双击应用程序的exe文件,你会得到一个进程的MainWindowTitle
将成为您exe文件的路径(所以与第一种情况相同,但没有file://
)。如果在项目的“调试”选项中取消选中“启用Visual Studio宿主进程”,您也可以在使用VS进行调试时使其像这样运行。
没有Visual Studio中,使用命令行
这会给你完全相同的结果为VS的“运行没有调试”选项。
我认为这里的重要信息是:不要用MainWindowTitle
找到你的应用程序。 Process.GetCurrentProcess()
将始终为您提供当前进程ID。
如果出于某种原因想要查找父进程,我建议您查看this question。我想你应该澄清一下:为什么你需要找到进程ID吗?你想用它做什么?
你能添加更多的细节吗?我很难理解你的意思。 – nvoigt
为什么地球应该关闭? – user1561108
对我而言,目前还不清楚你真正想要什么。你开始了第二个过程吗?你的第一个过程是什么样的?你为什么要找cmd.exe?你能写一个[最小,完整和可验证的例子。](http://*.com/help/mcve)? – nvoigt