Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2002.11.21;
Скачать: [xml.tar.bz2];

Вниз

Проблемы с локальным хуком WH_SHELL   Найти похожие ветки 

 
Oxy2   (2002-10-08 11:40) [0]

Привет!
Короче проблема такая. Ставлю локальный хук WH_SHELL на свою прогу что бы перехватывать создание и уничтожение окон своей проги. Тоесть ставлю хук на все нити своего екхешника. Для этого выполняю SetWindowsHookEx(WH_SHELL,@ShellProc,0,0). Но этот код выбрасывает ошибку ERROR_HOOK_NEEDS_HMOD. Но в хелпе прямо сказано, что если надо ставить хук на свой екзешник, то ставится hmod:=NULL. В принципе можно сделать SetWindowsHookEx(WH_SHELL,@ShellProc,0,GetCurrentThreadID), но тогда хук поставится только на одну нить. А мне нужно, что бы на все. Где грабли?


 
Cobalt   (2002-10-08 12:01) [1]

Грабель нет, просто дело в том, что хук ставиться на поток , а не на процесс, т.к. у каждого потока может быть своя очередь. Т.е. ставь хук на ВСЕ потоки СВОЕГО процесса.
А в хелпе, между прочим, сказано, что
dwThreadId
[in] Specifies the identifier of the thread with which the hook procedure is to be associated. If this parameter is zero, the hook procedure is associated with all existing threads running in the same desktop as the calling thread.

Т.е. и с теми, которые находятся не в твоем Адр. пр-ве.


 
Oxy2   (2002-10-08 13:14) [2]


> Грабель нет, просто дело в том, что хук ставиться на поток,
> а не на процесс, т.к. у каждого потока может быть своя очередь.
> Т.е. ставь хук на ВСЕ потоки СВОЕГО процесса.

Как? В соответствии с хелпом для этого надо сделать SetWindowsHookEx(WH_SHELL,@ShellProc,0,0). Но этот код во время выполнения вызывает вышеназваную ошибку.


 
Cobalt   (2002-10-09 11:31) [3]

Повторяю: если dwThreadId = 0, то это значит, что ты ставишь хук на ВСЕ потоки ВСЕХ процессов(т.е. не только твой процесс)
Пойми: хук ставиться на ПОТОК, а не на процесс!
Перефразирую: Ставь хук ОТДЕЛЬНО на каждый свой поток


 
Oxy2   (2002-10-09 13:16) [4]

Это не прикольно ;-))
Хорошо, а как тогда получить перечень всех потоков моего процесса?

Вообще то мне надо решить такую задачу. Если моя прога (какой то компонент или что то другое) создает окно, то надо перехватить создание этого окна и если оно не удовлетворяет каким либо критериям - убить его не показывая.


 
Cobalt   (2002-10-10 17:38) [5]


> Хорошо, а как тогда получить перечень всех потоков моего
> процесса?

См. модуль tlhelp32.pas, или поищи хотя-бы на яндексе по слову Thread32First



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2002.11.21;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.45 MB
Время: 0.008 c
4-69623
DeCompiler
2002-10-09 22:21
2002.11.21
Клик мышкой в чужом окне


1-69307
Gari
2002-11-12 09:22
2002.11.21
ActiveX компонент.


1-69354
Monak
2002-11-06 20:51
2002.11.21
Буфер обмена


1-69363
comandos
2002-11-10 10:38
2002.11.21
график


1-69341
Andrey-k
2002-11-11 23:17
2002.11.21
TGrid и TDBGrid и TDBListBox - общий вопрос





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский