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

Ответить

Код подтверждения
Введите код в точности так, как вы его видите. Регистр символов не имеет значения.

BBCode ВКЛЮЧЁН
[img] ВКЛЮЧЁН
[url] ВКЛЮЧЁН
Смайлики ОТКЛЮЧЕНЫ

Обзор темы
   

Развернуть Обзор темы: Как найти поток?

Eugie » 07 фев 2005, 19:13

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

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

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

Keith » 06 фев 2005, 03:49

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

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

И напоследок: если я повешу хук на одно окно процесса, то в другом окне этого процесса вызов нужной мне функции будет перехватываться? А если процесс будет создавать новые окна, то в них будет работать hook? Или мне надо будет вешать hook на CreateWindow? В общем разъясните кто знает!

Вернуться к началу