· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› Можно ли кильнуть фокус на кнопке?

<< . 1 . 2 .

Посл.отвђт Сообщен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

Спасибо, теперь понял :-)

<< . 1 . 2 .


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.083