![]() |
Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply |
![]() ![]() ![]() |
|
Proger101 |
|
||||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 16.5.2007 Репутация: нет Всего: нет |
Уважаемые системные прграммисты, простите за(возможно) ламерский вопрос.
Я хочу перехватывать все клавиши для всех приложений и для этого ставлю ловушку сообшиний:
Вызов процедур из основного модуля:
Ловушка должна перехватывать нажатие всех клавиш и записывать в файл коды нажатых клавиш. Но проблема в том что callback функция даже не вызывается!!!!! Помогите пожалуста. Заранее благодарен. |
||||
|
|||||
Ak47black |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2205 Регистрация: 2.12.2005 Репутация: нет Всего: 0 |
Если не хочешь писать весь код возьми этот бесплатный.
Если хочешь сам написать то сорри, может тебе кто другой пояснить. Это сообщение отредактировал(а) Ak47black - 30.6.2007, 23:48 Присоединённый файл ( Кол-во скачиваний: 43 ) ![]() |
|||
|
||||
ilyalyu |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 135 Регистрация: 25.10.2006 Репутация: нет Всего: нет |
При написании такого приложение есть два момента:
1. Hook надо создавать не внутри приложения, а в отдельной DLL. 2. Информацию от DLL к приложению надо передавать с помощью сообщений (windows messages), а не с помощью callback functions. Вот как это примерно выглядит:
|
|||
|
||||
mr.Anderson |
|
||||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: нет Всего: 128 |
Далеко не факт. Могу предоставить функцию для перехвата нажатий любых клавиш, которую пишем прямо в модуле программы, безо всяких DLL, что очень удобно. А вообще, все зависит от задачи. Если требуется отловить клавиши только в пределах формы приложения, то вполне хватит переопределения AppMsg.
|
||||
|
|||||
Ak47black |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2205 Регистрация: 2.12.2005 Репутация: нет Всего: 0 |
Интересно как если можно, я вроде думал всегда что надо через Dll перехватывать ( или дрова писать, там что угодно перехватить тогда можно) так как по идее простому окну от всех окон сообщения не приходят. И действует-ли твой метод на виндах от 98 по vista? Это сообщение отредактировал(а) Ak47black - 2.7.2007, 23:56 |
|||
|
||||
MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 16 Всего: 128 |
есть понятие локального и глобального хука. локальный действует - в пределах приложения. -------------------- There are always someone smarter than you... |
|||
|
||||
W4FhLF |
|
|||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: 6 Всего: 121 |
Но задача сформулирована: Поэтому мне тоже интересно как с помощью системного механизма хуков mr.Anderson без DLL внедряется во все приложения. -------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
|||
|
||||
mr.Anderson |
|
||||||||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: нет Всего: 128 |
Действует ли на Vista - понятия не имею, с ней никогда не работал. А вот на 98 работать должно вполне.
Насчет пределов приложения - я специально проверил, работает в пределах всей системы, даже если окно программы свернуто и неактивно. Итак, поехали. В главном модуле программы рисуем функцию:
Объявляем глобальную переменную:
Затем в OnCreate формы ставим хук:
На OnClose формы:
Запускаем и радуемся. Это сообщение отредактировал(а) mr.Anderson - 3.7.2007, 09:54 |
||||||||
|
|||||||||
Rennigth |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1708 Регистрация: 21.6.2004 Где: Moscow Репутация: 8 Всего: 76 |
-------------------- (* Honesta mors turpi vita potior *) |
|||
|
||||
mr.Anderson |
|
|||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: нет Всего: 128 |
Rennigth, а почему нет? Я не проверял, правда, дома только XP есть, но почему не должно работать-то? Или там системы хуков нет?
|
|||
|
||||
W4FhLF |
|
|||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: 6 Всего: 121 |
-------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
|||
|
||||
Ak47black |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2205 Регистрация: 2.12.2005 Репутация: нет Всего: 0 |
MetalFan, а почему тогда вообще хуком отлавливать если только из своего приложения нужно.
Тут просто можно написать свою процедуру обработки окна которая ловит WM_CHAR и хуков не каких ненужно. mr.Anderson, Мда интересно не думал что так можно сделать. Но я лучше буду использовать с dll чтобы не промахнуться на другой винде. Это сообщение отредактировал(а) Ak47black - 3.7.2007, 11:41 |
|||
|
||||
W4FhLF |
|
||||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: 6 Всего: 121 |
MSDN читаем, DLL тут не причём, это не случайность, а известная feature. from link:
Это сообщение отредактировал(а) W4FhLF - 3.7.2007, 12:30 -------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
||||
|
|||||
mr.Anderson |
|
|||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: нет Всего: 128 |
W4FhLF, вот я как раз хочу спросить, раз так, то какая разница - в DLL или в программе ставить хук? Все равно ниже чем на XP не сработает?
|
|||
|
||||
dumb |
|
|||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: 7 Всего: 158 |
для всех глобально устанавливаемых хуков(кроме _LL - WH_KEYBOARD_LL/WH_MOUSE_LL) процедуры обработки должны быть помещены в dll. система подгружает эту dll в адресные пространства всех оконных приложений для того, чтобы вызывать процедуру обработки хука в контексте генерирующего событие приложения. для _LL-хуков это не требуется, так как при вызове хук-процедуры происходит переключение в контекст установившего хук приложения(это доходчиво написано в ссылке, приведенной W4FhLFом). для локального хука dll, естественно, тоже не нужна. а это ты откуда выкопал? ![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "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. |