2010-10-07 44 views
4

我使用Process.Start從.NET創建了一個進程。新進程是一個遺留應用程序,用C/C++編寫。爲了與它溝通,我需要將PostThreadMessage等同於其主線程。從.NET中與非託管進程交談

我很樂意使用P/Invoke來調用PostThreadMessage,但我看不到如何找到主線程。 Process對象有一個線程集合,但是該文檔說集合中的第一個項目不需要是主線程。線程對象本身似乎沒有任何跡象表明它們是否是主要的。雖然我可以在創建流程後立即查看線程集合,但這並不能保證只有一個。

那麼,有沒有辦法讓我從.NET中確定另一個進程的主線程,還是需要求助於使用Win32的CreateProcess?

感謝,

鮑勃

回答

0

如果進程有一個窗口,你可以使用GetWindowThreadProcessId API來獲取GUI線程,這通常是主線程(使用Process.MainWindowHandle獲取窗口句柄)。

另一種選擇是枚舉線程(Process.Threads),並挑選出啓動的第一個基礎上,StartTime

Process process = Process.Start(...); 
process.WaitForInputIdle(); 
ProcessThread primaryThread = process.Threads.OrderBy(t => t.StartTime).First(); 

但它可能不是一個很準確的技術...

+0

不幸的是,傳統的應用程序沒有一個窗口。如果一個進程快速啓動多個線程,他們的開始時間可能是相同的。 – 2010-10-08 12:45:09

0

您不需要使用線程消息隊列的窗口。一旦線程調用像GetMessage或PeekMessage這樣的用戶函數,就會創建線程消息隊列。

這裏看到更多的信息在:About Messages and Message Queues

你仍然需要確定的「主」線程ID(和張貼線程/進程需要足夠的權限以及)有些意思。

這裏有一個答案:http://social.msdn.microsoft.com/forums/en-US/netfxbcl/thread/42de8f6a-61f4-495e-a69d-bd018e07c6f7

(請參見 「nobugz」 的答案)