Форум: "Начинающим";
Текущий архив: 2008.12.14;
Скачать: [xml.tar.bz2];
Внизhook, CBTProc, HCBT_CREATEWND Найти похожие ветки
← →
workbench (2008-11-01 15:30) [0]Здравствуйте, пытаюсь уствновить хук 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", только при закрытие оно вновь появляется, и так до бесконечности стреляет этими окошками, что я делаю неправильно при установке хука?
← →
Сергей М. © (2008-11-01 15:50) [1]А текст сообщения в этих окошках один и тот же и соответствует ожидаемому тобой ?
← →
lead-in (2008-11-01 16:01) [2]да, так это приложение тестовое, то здесь я пытаюсь отловить мною же созданное окно
← →
workbench (2008-11-01 16:10) [3]На сайте королевства нашёл вводную статью про хуки, там же было неск. примеров, думал что косячу где-то сам, но я пробовал прописывать этот в те самые примеры, результат тот же.
Вообще ещё не понятно что же должно быть результатом 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(), результат опять-таки тот же(((
← →
han_malign © (2008-11-01 16:17) [4]
> сам хук вроде срабатывает, появляется окошко "dll msg, lpszName"
...
← →
Сергей М. © (2008-11-01 16:24) [5]
> мною же созданное окно
Уж не с именем ли "dll msg, lpszName" это окно ?)
← →
workbench (2008-11-01 16:37) [6]dll msg, lpszName это просто caption окошка (не понимаю что в нём особенного), имя окна создание которого я пытаюсь отловить другое
← →
workbench (2008-11-01 16:38) [7]dll msg, lpszName это просто caption окошка (не понимаю что в нём особенного), имя окна создание которого я пытаюсь отловить другое
← →
workbench (2008-11-01 16:48) [8]Уфф... видимо все уже празднуют
Было б здорово получить всё-таки ответ на вопрос или совет.
С праздником всех, точнее с лишним выходным днём, если и есть что праздновать, так только это)))
← →
Сергей М. © (2008-11-01 16:49) [9]
> не понимаю что в нём особенного
В том-то и дело что ничего в нем особенного - такое же равноценное окошко, как и все прочие.
И факт его создания в момент вызова тобой MessageBox точно так же приводит к вызову ф-ции CBTProc, как и при создании того самого тестового окошка, которое ты собственно "ловишь".
Др.вопрос - почему у тебя всегда истинно условие
TCBTCreateWnd(Pointer(lParam)^).lpcs.lpszName = fWnd
..
А истинным оно может быть в том числе и при условии, что
fWnd = ""
и
TCBTCreateWnd(Pointer(lParam)^).lpcs.lpszName = nil
которые, очевидно, как раз и имеют место быть в данной ситуации.
← →
workbench (2008-11-01 16:56) [10]Сергей М.
да, вы пожалуй на 100% правы, а lpszName видимо действ nil, спасибо, думаю в выхи разберусь, щас уже кондиция не та)))
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2008.12.14;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.008 c