![]() |
Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply |
![]() ![]() ![]() |
|
Domoffou |
|
||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 60 Регистрация: 22.6.2008 Где: Северная Венеция Репутация: нет Всего: нет |
Здравствуйте.
Написал хук на клавиатуру (в dll), который прекрасно работал (месяца 3) до тех пор, пока я не сел поиграть в Diablo II LOD. Претензий к хуку (как к перехватчику) нет вообще - все прекрасно ловится. Вопрос только в том, что в Diablo II LOD во время работы хука перестают работать обычные клавиши. К примеру, работают клавиши Escape, Enter, F1 - F12, да и вообще все системные клавиши, кроме букв. Т.е. в лог они записываются, а сама игра на них никак не реагирует. Что самое интересное, если нажать клавишу Enter (для того, чтобы написать в общем чате), то все буквы прекрасно печатаются. Т.е. обычные буквы в логе появляются, при печатании сообщения в игре тоже, а если жмем, к примеру, B - чтобы открыть рюкзак, то ничего не происходит (будет работать только после выгрузки хука). Что примечательно, хук адекватно работать с Unreal Tournament 2004. Хотел бы поинтересоваться, в чем м.б. проблема, и вообще решается ли она?
Кстати, если строку
заменить на
то Diablo работает корректно ![]() |
||||||
|
|||||||
THandle |
|
||||||
![]() Хранитель Клуба ![]() Награды: 1 Профиль Группа: Админ Сообщений: 3639 Регистрация: 31.7.2007 Где: Moscow, Dubai Репутация: 7 Всего: 372 |
У меня нет никаких там Diabloв, но видимо в этом и есть дело, значит. Ведь PostMessage кладет сообщение в очередь... Пока оно обработается много может времени пройти... |
||||||
|
|||||||
Domoffou |
|
||||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 60 Регистрация: 22.6.2008 Где: Северная Венеция Репутация: нет Всего: нет |
В этом то и вопрос, ведь, если не ошибаюсь, во время перехвата клавиши происходит следующее: 1. перехват клавиши. 2. отправляем через postmessage сообщение для моей программы 3. не дожидаясь пока программа его обработает, сразу же возвращаем клавишу дальше (к следующему хуку). PostMessage кладет сообщение в очередь не дожидаясь ответа и сразу переходит к передаче введенной клавиши далее к следующему хуку (или к ОС). Следовательно, сообщение PostMessage не должно зависеть от CallNextHook, ноборот, везде советуют использовать именно такую форму отправки сообщений (т.к. SendMessage - это отправка сообщения, как я понимаю, с ожиданием ответа). Это сообщение отредактировал(а) Domoffou - 13.11.2008, 21:44 |
||||||||
|
|||||||||
dumb |
|
|||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: 7 Всего: 158 |
Domoffou, для низко-уровневых хуков DLL не нужна - вызов хук-процедуры происходит в контексте потока, установившего хук. соответственно отпадает надобность в меж-процессном взаимодействии(IPC) в виде всех этих MMF/Send/PostMessage.
поиск по форуму по слову WH_KEYBOARD_LL. |
|||
|
||||
Domoffou |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 60 Регистрация: 22.6.2008 Где: Северная Венеция Репутация: нет Всего: нет |
ок, я понял, но в данный момент у меня проходит довольно большая проверка на каждую клавишу, поэтому если я реализую это в конкретном приложении, в котором помимо обработки еще штуки 4 таймера, я рискую подвиснуть вообще... как мне обрабатывать клавишу, ну не в потоке же?
А если использовать хук то, теоретически, он делает PostMessage и сразу продолжает работать. |
|||
|
||||
dumb |
|
|||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: 7 Всего: 158 |
от того, что ты разместил код в DLL ничего не меняется.
после установки LL-хука, при нажатии клавиши система переключает контекст на поток, установивший хук(а это главный поток твоего приложения), и в этом контексте вызывает код хук-процедуры. таким образом ты можешь спокойно пользоваться всеми своими данными как обычно. оглядываться стоит только на время выполнения: не стоит делать всякие Sleep/ProcessMessages и другие блокирующие вызовы. если необходимо отложить обработку, то надо просто записать все данные из хука в обычную очередь(TList там какой-нибудь) - никаких ограничений на кол-во данных, как в случае с PostMessage. подвиснуть ты не рискуешь - при превышении опр.времени система просто отдаст "нажатие" дальше по цепочке. цитировать не стал, так как ничего ты особо не понял, и практически все, что написал, смысла не имеет(мягко говоря). |
|||
|
||||
Domoffou |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 60 Регистрация: 22.6.2008 Где: Северная Венеция Репутация: нет Всего: нет |
Я, конечно, понимаю, что вышенаписанный мною код содержит ошибки, причем при реализации, но прошу не показывать, что твои знания выше моих, я и так без этого догадываюсь, раз я спрашиваю а ты отвечаешь. Теперь я догадался, что мои попытки использовать в хуке PostMessage бессмысленны, т.к. использовать данный хук можно и вовсе внутри приложения... да и при зависании основного exe (или при длительном выполнении какой-либо операции), хук попросту зависает, не возвращая системе ничего... следовательно от этого все тормоза при перезагруженной системе. Но реально сейчас я не могу встроить хук в само приложение, т.к. оно уже весит около мегабайта и в нем и так содержатся куча других функций, ряд из которых нужно выполнять незамедлительно. К примеру, во время выполнения очередной операции придет клавиша, которую необходимо будет обработать, а приложение в недосягаемости. Соответственно, необходимость TStringList отпадает. Пришел к выводу, что необходимо в таком случае писать доп. ехе, в которой уже будет стоять низкоуровневый хук на клавиатуру (и др. хуки), который уже посредством PostMessage будет общаться с основной программой. Только в данном случае при отправке PostMessage приложение-хук зависать не будет в случае недосягаемости основного приложения-обработчика. Конечно, два активных ехе для одной программы - черезчур, но если выхода другого нет, то... Поправьте, если я не прав? Это сообщение отредактировал(а) Domoffou - 14.11.2008, 18:29 |
|||
|
||||
MetalFan |
|
||||||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 16 Всего: 128 |
может ставить LL хук в доп.потоке основного приложения? тогда и осн.поток виснуть не будет, и хук будет нормально работать...
только надо учесть примечания в библии (aka MSDN):
тут ты наверное не прав, ибо библийа гласит:
-------------------- There are always someone smarter than you... |
||||||
|
|||||||
Domoffou |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 60 Регистрация: 22.6.2008 Где: Северная Венеция Репутация: нет Всего: нет |
Интересная идейка... правда, честно говоря, не понимаю как реализовать установку хуков в отдельном потоке... м.б. установка хука должна производиться в основном,, а обработка - в отдельном потоке? Проблема в том, что у меня еще есть WH_Mouse_LL и WH_CBT :( а их, конечно, в идеале запихать вместе. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: WinAPI и системное программирование" | |
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |