2010-04-22 80 views
0

我有一個簡單的win應用程序(使用.net C#編寫)需要從cmd.exe啓動,然後寫入該控制檯,但問題是我需要該cmd.exe進程的進程ID。我可以得到所有正在運行的進程,如何查找從哪個應用程序啓動的cmd.exe進程ID?

Process[] procList = Process.GetProcessesByName("cmd"); 

但怎麼找到我的? :)

也許讀取輸入,並檢查是「ApplicationName.exe」寫在裏面,或得到臨牀活躍的cmd.exe窗口?但是用什麼功能?

+0

爲什麼Windows應用程序需要回寫到某個控制檯窗口?爲什麼不只是讓Windows應用程序彈出一個非模態窗體並將輸出放在那裏呢?你怎麼能保證Windows應用程序甚至從cmd.exe窗口啓動? – 2010-04-22 12:57:19

+0

父進程? – leppie 2010-04-22 12:57:30

+0

重複:http://stackoverflow.com/questions/394816/how-to-get-parent-process-in-net-in-managed-way – 2010-04-22 13:20:23

回答

0

即使您找到「您的」cmd,您將如何寫入它?

有一個更好的方法來實現你所描述的。只需將您的項目編譯爲「控制檯應用程序」,但無論如何都要創建一個WinForms窗口。是的,這是可能的,沒有任何東西阻止你。然後,你將能夠使用System.Console類寫入控制檯,不需要任何魔法。

0

下面的代碼創建一個WQL事件查詢來檢測一個新的進程,等待一個新的進程來啓動,然後顯示有關進程的信息:

WqlEventQuery query = new WqlEventQuery("__InstanceCreationEvent", new TimeSpan(0, 0, 1), "TargetInstance isa \"Win32_Process\""); 
ManagementEventWatcher watcher = new ManagementEventWatcher(query); 
ManagementBaseObject e = watcher.WaitForNextEvent(); 
Console.WriteLine("Process {0} has been created, path is: {1}", 
((ManagementBaseObject)e["TargetInstance"])["Name"], 
((ManagementBaseObject)e["TargetInstance"])["ExecutablePath"]); 
watcher.Stop(); 

我想你可能會找到一個解決您的通過檢查此WMI代碼示例來解決問題。希望能幫助到你。

0

一類的地方添加這個功能到您的項目: (需要在類的頂部using System.Runtime.InteropServices;

[DllImport("kernel32.dll")] 
    private static extern bool AttachConsole(int dwProcessId); 
    [DllImport("kernel32.dll")] 
    private static extern bool FreeConsole(); 

然後調用AttachConsole(-1) 現在你可以使用System.Console類像往常一樣去寫到控制檯,並設置顏色和whatnot。 如果您不再需要寫入控制檯,請致電FreeConsole()將其從您的進程中分離。

請注意,這實際上並未阻止控制檯處理其他命令。用戶仍然可以隨時進入控制檯。

推薦的方法如下:

  1. 創建控制檯應用程序
  2. 寫信給它任何你想要的。
  3. 撥打FreeConsole()一旦你不再需要它。
  4. 使用Application.Run()打開表單。不使用application.Run並且只顯示錶單不會創建適當的消息循環,並且可能發生奇怪的事情。

您可以切換3和4,但只要調用Application.Run方法,代碼將不會繼續,直到窗體關閉。因此,無論是在表單中寫入控制檯並從那裏釋放它,還是在單獨的線程中產生表單(這會產生其他意想不到的副作用)

您可以將任何進程ID提供給AttachConsole函數。 -1默認爲父進程,這很可能是你想要的。

相關問題