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

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

Замять сообщение [D5, Win95/98, WinME]


Kaurtsev ©   (2002-03-04 19:41:00) 

Братья земляне помогите!
Я отлавливаю при помощи хука на шелл какое либо событие, но как сделать что бы на этом оно и закончилось, как обрубить его что бы система его не получила? И где обрубать? В dll?


Dimaond Cat   (2002-03-06 22:23:00) [1]

это плохо


Fellomena   (2002-03-06 10:40:00) [2]

2 Dimaond Cat:
НИКОГДА!
Хуки выстраиваются в цепочку строго по мере их установки и никак иначе.


Dimaond Cat   (2002-03-05 23:24:00) [3]

А вот докучи, если мы ставим наш процес, по приоритету, одним из первых, то будет ли его хук одним из первых в цепочке обработчиков сообщения? если кто знает ответьте, а то чесно говоря лень проверять.


Raptor   (2002-03-05 22:54:00) [4]

2 Fellomena
Причем здесь обработчик системы? Если ставить хук на WH_GETMESSAGE, то система тут ничего не делает. Потоку посылается сообщение, а мы его перехватываем и не отдаем потоку. В результате получается, что с точки зрения потока этого сообщения как будто бы и вообще не было.
Но здесь проблема в другом. То что хочет автор вопроса можно сделать только ставя хук на WH_SHELL, а эти сообщения, в большинстве своем, только информативные. То есть изменить что то мы уже не можем. Мы только получаем информацию о каком-то уже состоявшемся событии.


Fellomena   (2002-03-05 11:03:00) [5]

Если я не ошибаюсь, некоторые сообщения вообще нельзя модифицировать - на них можно только реагировать !
А некоторые можно "останавливать".
К примеру в процедуре обработке хука WH_KEYBOARD есть возможность "остановить" дальнейшее прохождение сообщения (Result:= 0/ not(0))

2 Raptor:
Если не вызывать CallNextHookEx, то не будет вызываться предыдущий хук. А, как ты знаешь, перед твоим хуком, даже если он первый, всегда стоит обработчик самой системы, который независимо от того вызовешь ты CallNextHookEx или нет - обработает сообщение. (опять же речь идёт не о всех типах сообщений)
Сам попробуй с разными типми хуков - убедишься :)


Raptor   (2002-03-05 10:42:00) [6]

2 Dimaond Cat
Дык, ясен перец. Но тут спасения нет, разве что всегда ставить хук самым первым в цепочке. Иначе никак.

2 Kaurtsev
Я пробовал через WH_GETMESSAGE, но она выдаёт беск вереницу 0 и 1,(отображаю WParam в Memo)
А ты не отображай. Ты лучше хелп почитай, что это значит. ;-)
Тем более, что основная информация про перехваченое сообщение находится в lParam, а не в WParam.


Kaurtsev   (2002-03-05 09:46:00) [7]

Я пробовал через WH_GETMESSAGE, но она выдаёт беск вереницу 0 и 1,(отображаю WParam в Memo) а на нажатия кнопок, раскрытие окон и меню ноль внимания. В частности мне нужно запретить раскрытие стартового меню при нажатии микрофлага на клаве и Ctrl+Esc. Может поподробнее обьясните?


Dimaond Cat   (2002-03-05 01:56:00) [8]

если не вызывать Callnexthookex то сообщение замнется только для последующих в цепочке обработчиков, тогда как все предъидущие его нормально схавают.


Raptor   (2002-03-04 23:25:00) [9]

2 Kaurtsev
Не вызывать CallNextHookEx.


Юрий Зотов   (2002-03-04 20:41:00) [10]

> Kaurtsev © (04.03.02 19:41)

Хук WH_SHELL не позволяет модифицировать сообщения. Нужно ставить хук WH_GETMESSAGE.


> Song © (04.03.02 20:10)

1. Речь идет о глобальных хуках.
2. Есть подозрение, что вариант (Var Msg:TMessage) в сочетании с последующим Msg:=0 даже не откомпилируется.


Song   (2002-03-04 20:10:00) [11]

обычно когда отлавилвают сообщении, пишут Procedure .... (Var Msg:TMessage);
Словечко Var обозначает, что сообщение по инструкции inherited уйдёт из вашей процедуры уже с теми изменениями, которые Вы можете сделать. Поэтому чтобы "замять" сообщение, обычно достаточно написать Msg:=0;


Наверх

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