2015-06-21 317 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嗎?你想用它做什麼?