|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Мар 28, 2004 13:40:00 Four-F Вижу первоисточник у нас с тобой был один и тот же ;-) MessageBoxDisabledButton у меня на 98-й не запускается :-( Второй твой пример прикольный :-) У меня результаты пока более скромные, ещё не всё реализовал что хотел ;-) _982570993__Custom_MsgBox.rar |
|
|
Дата: Мар 28, 2004 15:44:36 · Поправил: Four-F [ Asterix: MessageBoxDisabledButton у меня на 98-й не запускается :-( ] Странно. Ей видимо не нравится, что EnableWindow при обработке HCBT_CREATEWND вызывается. Я просто втупую его туда засунул. На 2000 работает. Попробуй перемести EnableWindow в HCBT_ACTIVATE. Или поиграйся с HCBT_SETFOCUS. |
|
|
Дата: Мар 28, 2004 21:00:16 Four-F Бряк на начало CBTProc вообще не срабатывает, значит твой хук не срабатывает.. странно.. |
|
|
Дата: Мар 28, 2004 22:12:22 Очень странно. Если CustomMsgbox работает, то и MessageBoxDisabledButton тоже должен. Единственная разница это четыре нуля передавамых в MessageBox. Может твоей 98-й это не нравится. |
|
|
Дата: Мар 29, 2004 00:01:33 Four-F Точно! Ей, 98-й, не нравится NULL на месте параметра lpText для MessageBox'а, поправил, теперь работает. |
|
|
Дата: Мар 29, 2004 00:19:17 Единственное что я плохо понимаю это когда после срабатывания хука нужно возвращать FALSE и когда вызывать CallNextHookEx, от чего это зависит? |
|
|
Дата: Мар 29, 2004 12:50:47 Если ты из хуковой процедуры возвращаешь 0, то ты разрешаешь системе завершить операцию. Если возвращаешь 1, то запрещаешь. Например, чтобы запретить ставить фокус на кнопку можно сделать так: .if nCode == HCBT_SETFOCUS
invoke GetClassName, wParam, addr acClassName, sizeof acClassName
invoke lstrcmpi, addr acClassName, addr g_szButtonClasssName
.if eax == 0
xor eax, eax
inc eax
ret ; возвращаем 1 - кнопка не получит фокус.
.endif
А вызывать CallNextHookEx или нет это уже другая история. Все хуки ставятся в очередь. Если до тебя кто-то поставил хук, значит это ему зачем-то нужно. В случае WH_CBT хука это маловероятно. Поскольку ты поставил свой хук позже, то твою хуковую процедуру система вызовет первой. И в ней ты уже решаешь, позволить ли системе вызывать хуковые процедуры установленные ранее. Если ты вызовешь CallNextHookEx, система пройдет по всей очереди хуков (если она не пуста) и вызовет все хуковые процедуры. Вызывать CallNextHookEx можно и до или после своей обработки. Можно, например, так: .if nCode == HCBT_SETFOCUS
invoke CallNextHookEx, g_hMsgBoxHook, nCode, wParam, lParam
invoke GetClassName, wParam, addr acClassName, sizeof acClassName
invoke lstrcmpi, addr acClassName, addr g_szButtonClasssName
.if eax == 0
xor eax, eax
inc eax
ret ; возвращаем 1 - кнопка не получит фокус.
.endif
Т.е. сначала зовем цепочку хуков, а потом работаем сами. В принципе, в моём коде везде можно вообще убрать CallNextHookEx - они не нужны, т.к. для WH_CBT 100% гарантия, что хукаем только мы. Ведь окна еще не созданы, а поэтому похукать их извне невозможно. |
|
|
Дата: Мар 29, 2004 15:21:56 Four-F Спасибо, теперь понял :-) |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.083 |