如何在 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?你想用它做什么?
在我的 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?你想用它做什么?