![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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]А текст сообщения в этих окошках один и тот же и соответствует ожидаемому тобой ?