• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:既存プロセスからプロセスのプライマリースレッドIDの取得方法)

既存プロセスからプロセスのプライマリースレッドIDを取得する方法

このQ&Aのポイント
  • VC++で開発中の場合、CreateProcess関数を使用して開始したプロセスの情報がPROCESS_INFORMATIONに設定されるが、現在動作中のプロセスからそのプロセスのプライマリースレッドのIDを取得することは可能か?
  • 現在動作中のプロセスから指定したプロセスのプライマリースレッドに対してPostThreadMessageでメッセージを送ることができる
  • 対象のプロセスがウィンドウを持たない場合、EnumWindows関数を使用してウィンドウに対してPostMessageすることはできないため、スレッドに対してメッセージを送る必要がある

質問者が選んだベストアンサー

  • ベストアンサー
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.1

★アドバイス ・スレッド情報を列挙して一致するプロセス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に変換する方法を探した事が  ありますが見つかりませんでした。見つかったのはいずれも上記の方法ばかりです。 ・以上。参考に。

参考URL:
http://blog.goo.ne.jp/masaki_goo_2006/e/c80dd95f96cbd7aef524625da54b0ed0
Pkakedashi
質問者

お礼

ありがとうございました。Thread32First()、Thread32Next() を使用して無事解決することができました。 1点だけ確認したいのですが、同一プロセス内のスレッドのうち、列挙順の最初のスレッドそのプロセスのプライマリースレッドを示すと考えて良いのでしょうか? 何度かテストしたのですが、CreateProcessで取得できるスレッドIDと列挙順の最初のスレッドIDが同一であることが確認できました。 上記の仕様と解釈してしまってもよいのでしょうか?上記のような仕様じゃないと困ることがあるので。。。

その他の回答 (1)

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.2

★アドバイス >1点だけ確認したいのですが、同一プロセス内のスレッドのうち、 >列挙順の最初のスレッドそのプロセスのプライマリー・スレッドを示すと考えて良いのでしょうか?  どうなんでしょう?  私は列挙される最初の1つ目をプロセスのプライマリー・スレッドと考えていますが…。  私も実際に GetWindowThreadProcessId() で返されたスレッドIDと列挙される最初の1つ目を  チェックして一致したので多分最初の1つ目がプライマリー・スレッドのIDだと思います。 ・同様な関数群にモジュール(Module32First、Module32Next)の列挙があります。  こちらは MSDN サイトのどこかにしっかりと最初のモジュールがプロセス(exe)であると  書いてありました。スレッドの方は MSDN の書かれているかどうか分かりません。  でもプロセスは最低1つのスレッドを持ち、このスレッドはプロセスが終了するまで存在し、  子供のスレッドはプライマリー・スレッドの次に作られるので列挙の順がスレッドが  作成された順に列挙しているように思います。私の推測ですが…。  それにプライマリー・スレッドは一度消滅してまた作られることもないでしょうから。  という理由で最初に列挙される1つ目をプライマリー・スレッドと考えて良いような気がします。 ・以上。この回答は参考意見として下さい。

Pkakedashi
質問者

お礼

ありがとうございました。 そこらへんをもう少し調査してみようと思います。 大変参考になりました。

関連するQ&A