4

Process.Start を使用して .NET からプロセスを作成しています。新しいプロセスは、C/C++ で記述されたレガシー アプリです。それと通信するには、プライマリ スレッドに対して PostThreadMessage と同等の処理を行う必要があります。

P/Invoke を使用して PostThreadMessage を呼び出したいのですが、プライマリ スレッドを見つける方法がわかりません。Process オブジェクトにはスレッドのコレクションがありますが、コレクションの最初の項目がプライマリ スレッドである必要はないとドキュメントに記載されています。Thread オブジェクト自体には、それらがプライマリであるかどうかの兆候がないようです。プロセスを作成した直後にスレッド コレクションを確認することはできましたが、スレッド コレクションが 1 つしかないという保証はありません。

では、.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ウィンドウ ハンドルを取得するために使用します)。

もう 1 つのオプションは、スレッド ( ) を列挙しProcess.Threads、に基づいて開始された最初のスレッドを選択することStartTimeです。

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

しかし、それはおそらくあまり正確なテクニックではありません...

于 2010-10-07T21:15:49.373 に答える