4

我正在使用 Process.Start 从 .NET 创建一个进程。新进程是一个遗留应用程序,用 C/C++ 编写。为了与它通信,我需要对其主线程执行相当于 PostThreadMessage 的操作。

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

那么,有没有办法让我从.NET 中确定另一个进程的主线程,还是我需要求助于使用 Win32 的 CreateProcess?

谢谢,

鲍勃

4

2 回答 2

0

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

在此处查看更多信息:关于消息和消息队列

您仍然需要通过某种方式确定“主要”线程 ID(并且发布线程/进程也需要足够的权限)。

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

(见“nobugz”答案)

于 2010-12-06T21:44:50.650 回答
0

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

另一种选择是枚举线程 ( Process.Threads) 并选择第一个启动的线程,基于StartTime

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

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

于 2010-10-07T21:15:49.373 回答