Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

hook, CBTProc, HCBT_CREATEWND [D6, 2000]


workbench ©   (2008-11-01 15:30:00) 

Здравствуйте, пытаюсь уствновить хук WH_CBT, хочу отловить открытие  чужого окошка, делаю вот так:

в dll-ке ставлю хук:

hAHook := SetWindowsHookEx(WH_CBT, @CBTProc, hInstance, 0);
if hAHook = 0 then // error

CBTProc выглядит вот так:

function CBTProc(code: integer; wParam: wParam; lParam: lParam): longint; stdcall;
begin
 // fWnd - это заголовок нужного мне окна
 if code = HCBT_CREATEWND then
   if StrPas(TCBTCreateWnd(Pointer(lParam)^).lpcs.lpszName) = fWnd then
     begin
     MessageBox(0, PChar(TCBTCreateWnd(Pointer(lParam)^).lpcs.lpszName),
       PChar('dll msg, lpszName'), mb_ok or mb_iconinformation)
   end;
 // Result := 0
 Result := CallNextHookEx(hAHook {Win2000}, code, wParam, lParam)
end;

сам хук вроде срабатывает, появляется окошко "dll msg, lpszName", только при закрытие оно вновь появляется, и так до бесконечности стреляет этими окошками, что я делаю неправильно при установке хука?


workbench   (2008-11-01 16:56:00) [1]

Сергей М.

да, вы пожалуй на 100% правы, а lpszName видимо действ nil, спасибо, думаю в выхи разберусь, щас уже кондиция не та)))


Сергей М.   (2008-11-01 16:49:00) [2]


> не понимаю что в нём особенного


В том-то и дело что ничего в нем особенного - такое же равноценное окошко, как и все прочие.
И факт его создания в момент вызова тобой MessageBox точно так же приводит к вызову ф-ции CBTProc, как и при создании того самого тестового окошка, которое ты собственно "ловишь".

Др.вопрос - почему у тебя всегдаистинно условие

TCBTCreateWnd(Pointer(lParam)^).lpcs.lpszName = fWnd

..

А истинным оно может быть в том числе и при условии, что

fWnd = ''

и

TCBTCreateWnd(Pointer(lParam)^).lpcs.lpszName = nil

которые, очевидно, как раз и имеют место быть в данной ситуации.


workbench   (2008-11-01 16:48:00) [3]

Уфф... видимо все уже празднуют
Было б здорово получить всё-таки ответ на вопрос или совет.
С праздником всех, точнее с лишним выходным днём, если и есть что праздновать, так только это)))


workbench   (2008-11-01 16:38:00) [4]

dll msg, lpszName это просто caption окошка (не понимаю что в нём особенного), имя окна создание которого я пытаюсь отловить другое


workbench   (2008-11-01 16:37:00) [5]

dll msg, lpszName это просто caption окошка (не понимаю что в нём особенного), имя окна создание которого я пытаюсь отловить другое


Сергей М.   (2008-11-01 16:24:00) [6]


> мною же созданное окно


Уж не с именем ли "dll msg, lpszName" это окно ?)


han_malign   (2008-11-01 16:17:00) [7]


> сам хук вроде срабатывает, появляется окошко"dll msg, lpszName"

...


workbench   (2008-11-01 16:10:00) [8]

На сайте королевства нашёл вводную статью про хуки, там же было неск. примеров, думал что косячу где-то сам, но я пробовал прописывать этот в те самые примеры, результат тот же.

Вообще ещё не понятно что же должно быть результатом CBTProc, в SDK есть такое замечание:

"The value returned by the hook procedure determines whether Windows allows or prevents one of these operations" и далее вот это:

"For operations corresponding to the following CBT hook codes, the return value must be 0 to allow the operation, or 1 to prevent it:
HCBT_ACTIVATE
HCBT_CREATEWND
HCBT_DESTROYWND
HCBT_MINMAX
HCBT_MOVESIZE
HCBT_SETFOCUS
HCBT_SYSCOMMAND"

Пробовал я как Result ставить не CallNextHookEx(), результат опять-таки тот же(((


lead-in   (2008-11-01 16:01:00) [9]

да, так это приложение тестовое, то здесь я пытаюсь отловить мною же созданное окно


Сергей М.   (2008-11-01 15:50:00) [10]

А текст сообщения в этих окошках один и тот же и соответствует ожидаемому тобой ?


Наверх

Титульная страница Поиск, карта сайта Написать письмо