- ベストアンサー
既存プロセスからプロセスのプライマリースレッドIDを取得する方法
- VC++で開発中の場合、CreateProcess関数を使用して開始したプロセスの情報がPROCESS_INFORMATIONに設定されるが、現在動作中のプロセスからそのプロセスのプライマリースレッドのIDを取得することは可能か?
- 現在動作中のプロセスから指定したプロセスのプライマリースレッドに対してPostThreadMessageでメッセージを送ることができる
- 対象のプロセスがウィンドウを持たない場合、EnumWindows関数を使用してウィンドウに対してPostMessageすることはできないため、スレッドに対してメッセージを送る必要がある
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
★アドバイス ・スレッド情報を列挙して一致するプロセスIDのスレッドIDを使えば良いと思います。 列挙しないでプロセスID→スレッドIDの変換方法は私は知りません。あれば便利ですね。 スレッドの列挙は Thread32First()、Thread32Next() 関数で行えます。 詳しくは次のリンクをどうぞ。 http://blog.goo.ne.jp/masaki_goo_2006/e/c80dd95f96cbd7aef524625da54b0ed0 列挙したら THREADENTRY32 構造体の th32OwnerProcessID メンバが検索したい プロセスIDと一致していれば同じ構造体の th32ThreadID メンバがスレッドIDです。 これでプロセスIDからスレッドIDに変換できます。 ・以前に直接プロセスID(プロセスハンドル)からスレッドIDに変換する方法を探した事が ありますが見つかりませんでした。見つかったのはいずれも上記の方法ばかりです。 ・以上。参考に。
その他の回答 (1)
- Oh-Orange
- ベストアンサー率63% (854/1345)
★アドバイス >1点だけ確認したいのですが、同一プロセス内のスレッドのうち、 >列挙順の最初のスレッドそのプロセスのプライマリー・スレッドを示すと考えて良いのでしょうか? どうなんでしょう? 私は列挙される最初の1つ目をプロセスのプライマリー・スレッドと考えていますが…。 私も実際に GetWindowThreadProcessId() で返されたスレッドIDと列挙される最初の1つ目を チェックして一致したので多分最初の1つ目がプライマリー・スレッドのIDだと思います。 ・同様な関数群にモジュール(Module32First、Module32Next)の列挙があります。 こちらは MSDN サイトのどこかにしっかりと最初のモジュールがプロセス(exe)であると 書いてありました。スレッドの方は MSDN の書かれているかどうか分かりません。 でもプロセスは最低1つのスレッドを持ち、このスレッドはプロセスが終了するまで存在し、 子供のスレッドはプライマリー・スレッドの次に作られるので列挙の順がスレッドが 作成された順に列挙しているように思います。私の推測ですが…。 それにプライマリー・スレッドは一度消滅してまた作られることもないでしょうから。 という理由で最初に列挙される1つ目をプライマリー・スレッドと考えて良いような気がします。 ・以上。この回答は参考意見として下さい。
お礼
ありがとうございました。 そこらへんをもう少し調査してみようと思います。 大変参考になりました。
お礼
ありがとうございました。Thread32First()、Thread32Next() を使用して無事解決することができました。 1点だけ確認したいのですが、同一プロセス内のスレッドのうち、列挙順の最初のスレッドそのプロセスのプライマリースレッドを示すと考えて良いのでしょうか? 何度かテストしたのですが、CreateProcessで取得できるスレッドIDと列挙順の最初のスレッドIDが同一であることが確認できました。 上記の仕様と解釈してしまってもよいのでしょうか?上記のような仕様じゃないと困ることがあるので。。。