指定プロセスのスレッドIDを取得
たおたお 2013/6/20(Thu) 23:09:43|NO.55112
指定プロセスのスレッドIDを取得したいんですが
GetWindowThreadProcessIdで取得できるんでしょうか?
できる方いたらいろいろと教えてください!
test 2013/6/20(Thu) 23:20:41|NO.55113
GetWindowThreadProcessIdのようなWindows APIの使い方を調べるには、MSDNというサイトを使ってみましょう。詳しい情報が載っています。
プロセスを指定というのがどのような方法で指定したいのかわかりませんが、ウィンドウを指定するならGetWindowThreadProcessIdが使えます。
たおたお 2013/6/20(Thu) 23:26:47|NO.55114
プロセスIDを指定して対象プロセスのスレッドを特定したいです!
いろいろ調べてみるとGetWindowThreadProcessIdで取得はしないみたいです;
ht. 2013/6/21(Fri) 00:02:02|NO.55116
適当に調べてみましたがCreateToolhelp32Snapshotという便利なものがあるようです。
#uselib "kernel32"
#cfunc CreateToolhelp32Snapshot "CreateToolhelp32Snapshot" int, int
#cfunc Thread32First "Thread32First" int, int
#cfunc Thread32Next "Thread32Next" int, int
#define INVALID_HANDLE_VALUE $FFFFFFFF
#define TH32CS_SNAPTHREAD $00000004
pid = 0 // プロセスID(0だと自分のプロセスが指定される)
hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, pid)
if stat == INVALID_HANDLE_VALUE : mes "CreateToolhelp32Snapshot failed." : stop
dim thentry, 7 // HREADENTRY32構造体
thentry.0 = length(thentry) * 4
if Thread32First(hSnapshot, varptr(thentry)) == 0 : mes "Thread32First failed." : stop
do
mes "ThreadID:" + hSnapshot.th32ThreadID
until Thread32Next(hSnapshot, varptr(thentry))
たおたお 2013/6/21(Fri) 00:03:37|NO.55117
おおー
これは便利です!
ありがとうございます!
ht. 2013/6/21(Fri) 00:16:36|NO.55118
あ、かなり重大なミスをしてしまったので訂正します。
これを
mes "ThreadID:" + hSnapshot.th32ThreadID
以下のように変更してください。
mes "ThreadID:" + thentry.2
たおたお 2013/6/21(Fri) 00:22:33|NO.55119
ありゃあ、
mes "ThreadID:" + thentry.2
これに変更してPIDをタスクマネージャから調べて
そのまま投入して起動したところで
ThreadIDは0を指定してしまいます><
MillkeyStars 2013/6/21(Fri) 10:08:40|NO.55131
たぶんだけど、CreateToolhelp32Snapshot で取得できる、スレッドリストは
自身のプロセスだけしか取得できなかったような。
CreateToolhelp32Snapshot の第二引数が、第一引数によって制御されるはずだから、
第二引数を無視できる、自身のプロセスIDのみが、スレッドリストを取得できるはずかと。
http://msdn.microsoft.com/ja-jp/library/cc428938.aspx
別な方法でも探してみたけど、なかったです、ごめんなさい。
たおたお 2013/6/23(Sun) 22:21:10|NO.55195
なるほどー。
だから0になるんですね;
0にしても0になりました
どうすればいいんでしょうかね・・・><
ht. 2013/6/24(Mon) 06:02:57|NO.55200
それが駄目ならデスクトップのウインドウハンドルをFindWindowExに再帰的に掛けるなどして、全てのウインドウを取得してからGetWindowThreadProcessId関数を使ってプロセスとスレッドを調べるという方法もあります。
ただしあるプロセスの全てのスレッドがウインドウを所有しているとは限らないのでいくらかの取りこぼしは出るでしょう。
完全な方法もありますが例によってフックなので残念ながらHSP単体ではできません。
egachan 2013/6/24(Mon) 22:28:25|NO.55204
勘違いが多いようですがCreateToolhelp32Snapshotは現在ある全てのスレッドを取得できます。
逆に自プロセスや特定のプロセスのスレッド一覧を取得するものではないです。
#uselib "kernel32"
#cfunc CreateToolhelp32Snapshot "CreateToolhelp32Snapshot" int, int
#cfunc Thread32First "Thread32First" int, int
#cfunc Thread32Next "Thread32Next" int, int
#define INVALID_HANDLE_VALUE $FFFFFFFF
#define TH32CS_SNAPTHREAD $00000004
hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0)
if stat == INVALID_HANDLE_VALUE : mes "CreateToolhelp32Snapshot failed." : stop
dim thentry, 7 // HREADENTRY32構造体
thentry.0 = length(thentry) * 4
if Thread32First(hSnapshot, varptr(thentry)) == 0 : mes "Thread32First failed." : stop
sdim s,100000
do
s+=strf("ThreadID(ProcessID):%d(%d)\n",thentry.2,thentry.3)
until Thread32Next(hSnapshot, varptr(thentry))==0
mesbox s,640,480
egachan 2013/6/24(Mon) 22:54:51|NO.55205
というわけで
>指定プロセスのスレッドIDを取得したいんですが
上の方法で得た一覧から対象ののプロセスIDのスレッドを抜き出せばOKです。
MillkeyStars 2013/6/25(Tue) 22:39:05|NO.55242
あぁ、なるほど理解したわ。
スレッド一覧は、CreateToolhelp32Snapshot 第二 null か。
いつも、特定プロセスの使用モジュールの一覧取得でしかつかってなかったから、勘違いの原因だったのか。
スレ主ではないけど、なんとなくありがとう。