HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2013
0620
たおたお指定プロセスのスレッドIDを取得12未解決


たおたお

リンク

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 か。

いつも、特定プロセスの使用モジュールの一覧取得でしかつかってなかったから、勘違いの原因だったのか。
スレ主ではないけど、なんとなくありがとう。



ONION software Copyright 1997-2023(c) All rights reserved.