
No.3ベストアンサー
- 回答日時:
実行中スレッド監視という処理概念で定義しますね。
1.SetWindowsHookEx()で、ForegroundIdleProc を渡す
つまり、システム上の全スレッドを監視します。
2.任意スレッドが実行されたらフックプロシージャが
呼び出されるのでここで、GetCurrentThreadId() 関数を
使います。
プロシージャからチェインする前に共有変数
<例>(DWORD th[65535]と定義)にスレッドIDをストア。
<例> for (int i=0;i<=インデックス;i++)
if (th[i]==スレッドID) break;
if (インデックス^i-1) th[インデックス++]=スレッドID
3.2の処理をTSR処理(常駐)させます。
4.メインアプリケーションでは共有変数を参照してIDを列挙します。
複雑で申し訳ないのですが一例としてどうでしょうか・・?
No.4
- 回答日時:
別スレッドが属するウインドウがアクティブにならない限り
自己スレッドのままになりますね・・・。
ブロードキャストでアクティブにすることもできますが、
処理がグズグスになるためフックは避けたほうがよさそうです。
スレッドIDを引数として取るAPI関数などでエラー(無効ID)
検出を使って0からスレッド最大個数整数値のループから拾う
こともできるかもしれませんが・・。
あとはキー名はわかりませんが、レジストリ参照とか・・。
(結局参考にならず、すみません・・・)
ありがとうございました。
完全に満足するものは作成できませんでしたが、それなりのものは作成することが出来ました。何より、いろいろとフック関係の勉強になりました。
No.2
- 回答日時:
#1です。
"pEnd"変数は無視してください、未定義ゴミ変数です。
度々のフォローありがとうございます。
再度、質問させてください。
SetWindowsHookExなどをいろいろと調べて、私が望んでいる仕様に
するには、システムフックにする必要があること。そうするには
DLL化する必要があることなどは分かりました。
で、自分なりにコーディングしてみて、デバッカで確認しました。
SetWindowsHookExで指定したプロシージャが頻繁に呼ばれている
ようですが、GetCurrentThreadIdの値が毎回同じになります。
ちなみに、このIdはDLL関数を呼び出す、メイン側のスレッドIdと
同じことも確認しました。
このような現象に関してなにか知識をお持ちでないでしょうか?
参考までにソースです
///// Cppファイル /////
#include "MyHooker.h"
int WINAPI DllMain(HINSTANCE hInstance , DWORD dwReason , PVOID pvReserved)
{
ghDllInst = hInstance;
memset(gdwThreadIds, NULL, MAXWORD);
return(TRUE);
}
BOOL Hook()
{
ghHook = SetWindowsHookEx(WH_FOREGROUNDIDLE, (HOOKPROC)Procedure, ghDllInst, 0);
if(ghHook) return(TRUE);
return(FALSE);
}
BOOL UnHook()
{
if(ghHook) UnhookWindowsHookEx(ghHook);
ghHook = NULL;
return(TRUE);
}
LRESULT CALLBACK Procedure(int nCode, WPARAM wParam, LPARAM lParam)
{
if(nCode < 0) return(CallNextHookEx(ghHook, nCode, wParam, lParam));
DWORD dwThreadId = GetCurrentThreadId();
for(int i = 0; i < MAXWORD; i++) {
if(gdwThreadIds[i] == dwThreadId) break;
if(gdwThreadIds[i] == NULL) {
gdwThreadIds[i] = dwThreadId;
break;
}
}
return CallNextHookEx(ghHook, nCode, wParam, lParam);
}
///// ヘッダーファイル /////
#define DLL_EXPORT __declspec (dllexport)
#include "windows.h"
#pragma data_seg(".ShareData")
HHOOKghHook= NULL;
#pragma data_seg()
HINSTANCEghDllInst= NULL;
DLL_EXPORT BOOL Hook();
DLL_EXPORT BOOL UnHook();
DLL_EXPORT LRESULT CALLBACK Procedure(int nCode, WPARAM wParam, LPARAM lParam);
///// Defファイル /////
LIBRARY
SECTIONS
.ShareData READ WRITE SHARED
No.1
- 回答日時:
<定義>
typedef BOOL (WINAPI *_EnumProcesses)(DWORD*,DWORD,DWORD*);
typedef BOOL (WINAPI *_EnumProcessModules)(HANDLE,HMODULE*,DWORD,LPDWORD);
typedef DWORD (WINAPI *_GetModuleBaseName)(HANDLE,HMODULE,LPTSTR,DWORD);
_EnumProcesses EnumProcesses;
_EnumProcessModules EnumProcessModules;
_GetModuleBaseName GetModuleBaseName;
<処理>
HMODULE hDll,hModule[1];
HANDLE hToken, hProcess;
TOKEN_PRIVILEGES tp;
LUID luid;
CHAR pBuf[256];
DWORD pID[255],pNum=0,pNum2=0,i;
OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,&hToken);
LookupPrivilegeValue(NULL,SE_DEBUG_NAME,&luid);
tp.PrivilegeCount=1;
tp.Privileges[0].Luid=luid;
tp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken,FALSE,&tp,sizeof(TOKEN_PRIVILEGES),NULL,NULL);
hDll=LoadLibrary("psapi.dll");
EnumProcesses=(_EnumProcesses)GetProcAddress(hDll,"EnumProcesses");
EnumProcessModules=(_EnumProcessModules)GetProcAddress(hDll,"EnumProcessModules");
GetModuleBaseName=(_GetModuleBaseName)GetProcAddress(hDll,"GetModuleBaseNameA");
i=(EnumProcesses)(pID,sizeof(pID),&pNum);
pNum/=sizeof(DWORD);
for (i=0,pEnd=true;i<pNum;i++)
{
hProcess=OpenProcess(PROCESS_ALL_ACCESS,0,pID[i]);
if (!hProcess) {CloseHandle(hProcess);continue;}
(EnumProcessModules)(hProcess,hModule,sizeof(hModule),&pNum2);
(GetModuleBaseName)(hProcess,hModule[0],pBuf,sizeof(pBuf));
// pBuf=プロセス名
CloseHandle(hProcess);
}
CloseHandle(hToken);
FreeLibrary(hDll);
がシステムプロセス(WinLogon.exe など)も列挙する一例ですが、
スレッド名はEnumWindowsを使います。
そもそもスレッドは名目実体がないため、列挙トップウインドウの
ハンドルからタイトルとスレッドID(GetWindowThreadProcessId)
を取得して、列挙終了後に昇順に並べたスレッドIDごとに
ID一致するタイトル名をツリー階層表示するのが良いと思いますよ。
参考にしてみてください。
ご回答ありがとうございます。
おっしゃっている意味は大体理解できました。
ただ、GetWindowThreadProcessIdだと、トップレベルウィンドウを
作成したスレッドのIDを取得する感じですよね。
例えば、マルチスレッドのアプリケーションなどの場合は複数の
スレッドが生成されていると思うのですが、その複数のスレッド
すべてのIDを取得するのは難しいのですかね?
質問ばかりで申し訳ありません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
今、見られている記事はコレ!
-
弁護士が解説!あなたの声を行政に届ける「パブリックコメント」制度のすべて
社会に対する意見や不満、疑問。それを発信する場所は、SNSやブログ、そしてニュースサイトのコメント欄など多岐にわたる。教えて!gooでも「ヤフコメ民について」というタイトルのトピックがあり、この投稿の通り、...
-
弁護士が語る「合法と違法を分けるオンラインカジノのシンプルな線引き」
「お金を賭けたら違法です」ーーこう答えたのは富士見坂法律事務所の井上義之弁護士。オンラインカジノが違法となるかどうかの基準は、このように非常にシンプルである。しかし2025年にはいって、違法賭博事件が相次...
-
釣りと密漁の違いは?知らなかったでは済まされない?事前にできることは?
知らなかったでは済まされないのが法律の世界であるが、全てを知ってから何かをするには少々手間がかかるし、最悪始めることすらできずに終わってしまうこともあり得る。教えてgooでも「釣りと密漁の境目はどこです...
-
カスハラとクレームの違いは?カスハラの法的責任は?企業がとるべき対応は?
東京都が、客からの迷惑行為などを称した「カスタマーハラスメント」、いわゆる「カスハラ」の防止を目的とした条例を、全国で初めて成立させた。条例に罰則はなく、2025年4月1日から施行される。 この動きは自治体...
-
なぜ批判コメントをするの?その心理と向き合い方をカウンセラーにきいた!
今や生活に必要不可欠となったインターネット。手軽に情報を得られるだけでなく、ネットを介したコミュニケーションも一般的となった。それと同時に顕在化しているのが、他者に対する辛らつな意見だ。ネットニュース...
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
マルチスレッドプログラム
-
スレッドの監視方法について
-
別スレッドからのフォームのテ...
-
多人数のチャットソフトを考え...
-
C++マルチスレッド処理について
-
マルチスレッド内のループについて
-
別スレッドからメインダイアロ...
-
.netアプリへのSendMessageでフ...
-
マルチコアを有効利用するプロ...
-
CWnd::OnTimerのスレッドの取得
-
スレッドにて同一メモリの書き...
-
待機関数(WaitForMultipleObjec...
-
スレッドの終了の仕方
-
WaitForSingleObjectの使い方に...
-
メインスレッドのPostMessageと...
-
_beginthreadexで生成したスレ...
-
C++でマルチスレッド処理をさせ...
-
Macターミナルで実行中のプログ...
-
powershell を使いカレントディ...
-
タスクマネージャーのプロセス...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VC++スレッドの正しい終了のさ...
-
WaitForSingleObjectの使い方に...
-
Windows上で、シグナル(SIGTERM...
-
スレッドの監視方法について
-
CWnd::OnTimerのスレッドの取得
-
スレッドにて同一メモリの書き...
-
スレッドの安全な終了のさせ方
-
スレッドの終了の仕方
-
スレッドの終了はどうやるんで...
-
Linuxでスレッド優先度って変え...
-
別スレッドからメインダイアロ...
-
メインスレッドのPostMessageと...
-
待機関数(WaitForMultipleObjec...
-
VB2005 シリアル通信のClose処理
-
マルチスレッドプログラミング...
-
excelvbaでCreateThreadの動作
-
.NetのBackgroundWorkerクラス...
-
スレッドでWM_TIMERを受け取れない
-
メインダイアログが最背面に表...
-
スレッド一覧の取得
おすすめ情報