从.NET与非托管进程通信

4
我正在使用Process.Start在.NET中创建一个进程。新进程是一个用C/C++编写的遗留应用程序。为了与它通信,我需要执行类似于PostThreadMessage到其主线程的操作。
我很乐意使用P/Invoke来调用PostThreadMessage,但我不知道如何找到主线程。Process对象有一组线程,但文档说集合中的第一项不一定是主线程。线程对象本身似乎没有任何指示它们是否是主线程。虽然我可以在创建进程后立即查看线程集合,但这并不能保证只有一个线程。
那么,有没有办法让我从.NET确定另一个进程的主线程,或者我需要使用Win32的CreateProcess?
谢谢,
Bob
2个回答

0
如果进程有窗口,您可以使用GetWindowThreadProcessId API获取GUI线程,通常是主线程(使用Process.MainWindowHandle获取窗口句柄)。
另一个选项是枚举线程(Process.Threads),并根据StartTime选择第一个启动的线程:
Process process = Process.Start(...);
process.WaitForInputIdle();
ProcessThread primaryThread = process.Threads.OrderBy(t => t.StartTime).First();

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

不幸的是,传统应用程序没有窗口。如果一个进程快速启动多个线程,它们的启动时间可能相同。 - Bob A.

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接