与.NET中的非托管进程交谈

时间:2010-10-07 19:53:05

标签: .net interprocess

我正在使用Process.Start从.NET创建一个进程。新流程是一个用C / C ++编写的遗留应用程序。为了与它通信,我需要将PostThreadMessage等效于其主要线程。

我很乐意使用P / Invoke来调用PostThreadMessage,但我看不到如何找到主线程。 Process对象有一组线程,但doc说集合中的第一项不必是主线程。 Thread对象本身似乎没有任何迹象表明它们是否是主要的。虽然我可以在创建流程后立即查看线程集合,但不能保证只有一个。

那么,有没有办法让我从.NET确定另一个进程的主线程,或者我是否需要使用Win32的CreateProcess?

谢谢,

鲍勃

2 个答案:

答案 0 :(得分:0)

如果进程有窗口,您可以使用GetWindowThreadProcessId API获取GUI线程,这通常是主线程(使用Process.MainWindowHandle来获取窗口句柄。)

另一种选择是枚举线程(Process.Threads)并根据StartTime选择第一个已启动的线程:

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

但它可能不是一种非常准确的技术......

答案 1 :(得分:0)

您不需要Window来使用线程消息队列。一旦线程调用GetMessage或PeekMessage等用户函数,就会创建线程消息队列。

请点击此处查看更多信息:About Messages and Message Queues

仍然需要确定“主要”线程ID(并且发布线程/进程也需要足够的权限)。

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

(参见“nobugz”答案)