Как найти поток?

Общие вопросы, не зависящие от языка реализации.

Модераторы: Duncon, Hawk, Romeo, Eugie

Ответить
Keith
Сообщения: 15
Зарегистрирован: 06 фев 2005, 03:13

06 фев 2005, 03:49

Мне нужно найти в системе такой поток нужного мне процесса, который имеет окно(очередь сообщений). Перебрать(toolhelp API) все процессы и найти нужный я могу, перебрать все потоки найденного процесса я то же могу, но как узнать, что какой-то поток имеет окно? Мне это нужно для того, чтобы повесить Hook на определенный процесс, а SetWindowsHookEx принимает в качестве параметра ThreadId. Может быть можно повесить хук на любой из найденных потоков? Или на все?

Может быть лучше перебирать все окна, для каждого определять имя процесса(exe'шник) и если нужный, то определять для такого окна хэндл потока? Если так, то подскажите последавательность API-функций, которые надо вызвать, только учтите, что:
- это должно работать начиная с Win98;
- окно может быть с любым заголовком;
- окно может быть в трее.

И напоследок: если я повешу хук на одно окно процесса, то в другом окне этого процесса вызов нужной мне функции будет перехватываться? А если процесс будет создавать новые окна, то в них будет работать hook? Или мне надо будет вешать hook на CreateWindow? В общем разъясните кто знает!
Eugie
Сообщения: 707
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

07 фев 2005, 19:13

ИМХО, в данном случае проще всего повесить глобальный хук. Сразу а) решается проблема 'что будет если процесс создает новые окна' и б) не требуется привязка к конкретному потоку (в соотв.параметр SetWindowsHookEx передается 0). Напомню на всякий случай, что hook procedure в этом случае должна размещаться в DLL. Да и ставить его лучше из самой DLL при ее загрузке (на DLL_PROCESS_ATTACH; соответственно, сносить на DLL_PROCESS_DETACH).

Что касается первоначального вопроса, в WinXP/2003Srv есть такая функция IsGUIThread. Она позволяет не только узнать, является ли поток GUI-шным, но и при необходимости сделать его таковым. Собственно, вся разница между рабочим и GUI потоком в наличии у последнего очереди сообщений и контекста (структура типа THREADINFO).
Ответить