![]() |
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]() ![]() ![]() |
|
Budy |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 616 Регистрация: 6.2.2004 Где: Екатеринбург Репутация: 1 Всего: 2 |
:Приветсвую
Делаю ловушку на клавиатуру. Использую Hook, использую DLL. Все норм работает, но есть проблема - при запуске проги все тормозит. TaskMan 100%ую загрузку ЦП показывает. Видать получился глобальный Хук, а хотелось чтоб не тормозило. Помогите плз -------------------- Как ты назовешь свой корабль, так на нем и напишут ![]() |
|||
|
||||
Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 36 Всего: 329 |
Я тоже когда-то пытлся делать ловушки, осталось вот несколько примеров, незабывай проверять раскладку клавиатуры.
Присоединённый файл ( Кол-во скачиваний: 80 ) ![]() |
|||
|
||||
Bes |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 806 Регистрация: 8.12.2004 Репутация: 5 Всего: 7 |
Можно использовать getkeystate тогда и без дллки обойтись можно.
|
|||
|
||||
RA |
|
|||
![]() Брутальный буратина ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3497 Регистрация: 31.3.2002 Где: Лес Репутация: 14 Всего: 115 |
Budy Покажи код.
|
|||
|
||||
Budy |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 616 Регистрация: 6.2.2004 Где: Екатеринбург Репутация: 1 Всего: 2 |
Прога, запускающая DLL'ку:
Прога в памяти весит, всего около 300 Кб имеет. А вот DLL'ка:
PS.В коде (здесь строки 75-76) пробовал писать Result:=CallNewxt...... Тогда клавиши не возращаются нужным приложениям. Bes, расскажи поподробнее. Просто пробовал в EXE'шник пихнуть - когда на клаве щелкаешь кнопки при других окнах, они закрываются. Это сообщение отредактировал(а) Budy - 20.4.2005, 17:25 -------------------- Как ты назовешь свой корабль, так на нем и напишут ![]() |
||||
|
|||||
RA |
|
|||
![]() Брутальный буратина ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3497 Регистрация: 31.3.2002 Где: Лес Репутация: 14 Всего: 115 |
Убери repeat until false;
|
|||
|
||||
Budy |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 616 Регистрация: 6.2.2004 Где: Екатеринбург Репутация: 1 Всего: 2 |
RAdmin, дык тогда ничего работать и не будет
-------------------- Как ты назовешь свой корабль, так на нем и напишут ![]() |
|||
|
||||
RA |
|
|||
![]() Брутальный буратина ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3497 Регистрация: 31.3.2002 Где: Лес Репутация: 14 Всего: 115 |
Ты пробовал?
|
|||
|
||||
RA |
|
|||
![]() Брутальный буратина ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3497 Регистрация: 31.3.2002 Где: Лес Репутация: 14 Всего: 115 |
То верхнее это моя оценка на вскидку.
А вот специально решил посмотреть что к чему: Почему в CallNextHookEx(HK,Code,wParam,lParam); переменная "HK" а тут hook:=SetWindowsHookEx(WH_KEYBOARD,@gethook,hInstance,0); hook ? Они хоть потом связываются или как? Я заменил HK на Hook. Загузчик ...... implementation function StartHOOK: Longint; external 'getkeys.dll' name 'StartHOOK'; {$R *.dfm} procedure ..... begin StartHOOK; end; И всё работает пучком. ЗЫ: так как код процедуры "AddKey" ты не показал то я туда вставил бональный ShowMessage. (для теста) |
|||
|
||||
Budy |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 616 Регистрация: 6.2.2004 Где: Екатеринбург Репутация: 1 Всего: 2 |
RAdmin, я с "HK" и "hook" перепутал, короче это одна и та же переменная, иначе "hook: HHOOK;"
AddKey - здесь я сохраняю клавиши в оперативную память, пробовал в файл сохранять - возникают проблемы из за загрузки ЦП. Добавлено @ 14:45
Дак прога тогда закрывается. -------------------- Как ты назовешь свой корабль, так на нем и напишут ![]() |
||||
|
|||||
Budy |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 616 Регистрация: 6.2.2004 Где: Екатеринбург Репутация: 1 Всего: 2 |
Работать то работает, да вот память сильно грузит :\ -------------------- Как ты назовешь свой корабль, так на нем и напишут ![]() |
|||
|
||||
RA |
|
|||
![]() Брутальный буратина ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3497 Регистрация: 31.3.2002 Где: Лес Репутация: 14 Всего: 115 |
Budy Ну не знаю, то что я проверял работало без напрягов.
Пришли мне на мыло весь исходник, или тут выложи (только в аттаче). exxxxx [a] gmail.com |
|||
|
||||
Budy |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 616 Регистрация: 6.2.2004 Где: Екатеринбург Репутация: 1 Всего: 2 |
RAdmin, дак я весь и выложил. Есть прога (там всего 5 строчек), которая запускает DLL и держит его в памяти. DLL в свою очередь ставит ловушку, и проверяет на нажатие клавиш на клавиатуре. Три процедуры, что я не расписывал не представляют из себя ничего серьезного - у все сводил к минимуму, просто получал Key_Name (GetKeyNameText(lParam, Key_Name, sizeof(Key_Name));) и записывал в файл. Всеравно всю память использует.
Может ловушка "слишком много на себя берет"? -------------------- Как ты назовешь свой корабль, так на нем и напишут ![]() |
|||
|
||||
Budy |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 616 Регистрация: 6.2.2004 Где: Екатеринбург Репутация: 1 Всего: 2 |
Ага, в этом все и дело. Я переделал запускающую прогу чтоб без зацикливания была, все встало на место Добавлено @ 20:57 А я себе в голову вбил, что ето все DLL'ька виновата ![]() -------------------- Как ты назовешь свой корабль, так на нем и напишут ![]() |
|||
|
||||
RA |
|
|||
![]() Брутальный буратина ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3497 Регистрация: 31.3.2002 Где: Лес Репутация: 14 Всего: 115 |
ну вот и замечательно
![]() |
|||
|
||||
Budy |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 616 Регистрация: 6.2.2004 Где: Екатеринбург Репутация: 1 Всего: 2 |
А как мона сделать чтоб DLL передавала какието параметры вызвающей программе?
Ну например в этом случае, DLL получила клавишу и нужно ее передать программе.. -------------------- Как ты назовешь свой корабль, так на нем и напишут ![]() |
|||
|
||||
RA |
|
|||
![]() Брутальный буратина ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3497 Регистрация: 31.3.2002 Где: Лес Репутация: 14 Всего: 115 |
||||
|
||||
vintch |
|
||||
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 24.4.2005 Репутация: нет Всего: нет |
Это в Win-проге использовать просто нельзя! ![]() Нужно:
PS. SetTimer и всё что с ним связано - чисто для показухи ![]() |
||||
|
|||||
Budy |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 616 Регистрация: 6.2.2004 Где: Екатеринбург Репутация: 1 Всего: 2 |
vintch, ага, я уже понял
![]() -------------------- Как ты назовешь свой корабль, так на нем и напишут ![]() |
|||
|
||||
Dr.No_xXx |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 215 Регистрация: 24.2.2005 Репутация: нет Всего: нет |
Зачем? и какие именно? |
|||
|
||||
Budy |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 616 Регистрация: 6.2.2004 Где: Екатеринбург Репутация: 1 Всего: 2 |
RAdmin, я мона полегче примерчик? Я шото там запутался
![]() Dr.No_xXx, посмотри эту тему. Я кидал код, там процедуре "procedure AddKey(Key: String);" я передаю полученную нажатую клавишу. Дак вот спрашиваю, как эту "Key: String" - клавишу передать в главную прогу? -------------------- Как ты назовешь свой корабль, так на нем и напишут ![]() |
|||
|
||||
Rouse_ |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 469 Регистрация: 23.4.2005 Репутация: 5 Всего: 29 |
Ты работаешь под NT? Если так то не нужны никакие лишние DLL. Вот смотри примерчик:
|
||||
|
|||||
vintch |
|
|||
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 24.4.2005 Репутация: нет Всего: нет |
Да, признаться, давно я на MSDN небыл
![]() Rouse, ещё новичком себя называет ![]() PS. А можно ещё так: не repeat until false; а repeat sleep(10) until false; ![]() ![]() Это сообщение отредактировал(а) Girder - 26.4.2005, 13:54 |
|||
|
||||
Rouse_ |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 469 Регистрация: 23.4.2005 Репутация: 5 Всего: 29 |
Ну можно и application.HandleMessage или ее аналог написать. Самый ненапряжный вариант ![]() |
|||
|
||||
Rouse_ |
|
||||||||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 469 Регистрация: 23.4.2005 Репутация: 5 Всего: 29 |
Ну чтож, давайте теперь разберем ошибки.
dsergey: Папка D6Hook1 файл hook.pas смотрим код:
Теперь вопрос. С каких пор WParam поменяло значение с двойного слова на одинарное? Правильней будет Longint(DWORD, Cardinal) но никак не word. Самое правильное - специально определенный тип для всех hook procedures объявленный в модуле Windows.pas под названием WPARAM; Собстенно вот все используемые типы:
Исследуем далее код функции function HookProc того же модуля
Довольно оптимистичное начало. Благо что данный код исполняется в локальном приложении, в противном случае была бы разбита цепочка хуков и никто не смог бы гарантировать правильную работу не только своих, но и чужих приложений... Ну и естестенно довольно странно видеть проверку при уничтожении хука:
...при ее полном отсутствии на момент создания:
Папка D6Hook2DLL, модуль keyboardhook.dpr: смотрим код:
В данном случае из-за объявления stdcall, абсолютно здесь не уместного никогда в жизни не отработает сообщение DLL_PROCESS_DETACH Далее абсолютно не понятен двойной вызов следующей функции на момент инициализации библиотеки.
Папка D6Hooks модуль HookDll.pas Та же ошибка с word, ну и явно безграмотное написание библиотеки с разбитием цепочки хуков, так как автор видимо забывает что все экземпляры библиотеки разнесены по различным адресным пространствам приложений и не потрудился создать единые экземпляры констант чере отображаемые в память процесса файлы. Предыдужий пример был написан намного лучше. Примеры в архивах даже не хочется комментировать. По поводу примера от RAdmin. Ну это немного не из той серии, но очень грамотно написаный пример... Мой пост собственно не указание на ошибки, а указание на возможные неприятности при бездумном использовании кода... Это сообщение отредактировал(а) Rouse_ - 26.4.2005, 20:05 |
||||||||||||||
|
|||||||||||||||
RA |
|
||||
![]() Брутальный буратина ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3497 Регистрация: 31.3.2002 Где: Лес Репутация: 14 Всего: 115 |
Дык человек вопрос задал :
Естесно потом возникнет вопрос а как текст передать. и тд. А что касатется хука на клаву то мой пример уже давно пылится в кладовке. (тотже принцип что и у тебя, толкьо с перламутровыми пуговицами ) Это сообщение отредактировал(а) RAdmin - 26.4.2005, 20:56 |
||||
|
|||||
Budy |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 616 Регистрация: 6.2.2004 Где: Екатеринбург Репутация: 1 Всего: 2 |
RAdmin, Rouse_, пасибо, ребята! Оба помогли, у обоих код позаимствовал
![]() -------------------- Как ты назовешь свой корабль, так на нем и напишут ![]() |
|||
|
||||
Denis-delphist |
|
|||
Unregistered |
Уменьшь её на сколько можно и пусть результат не в прогу пишется, а в LOG файл, не указывая время(Только беквы и цифры). Ещё можно эту штуку коммандной строкой сделать!!! Также можно сделать так, чтобы не все буквы запоминались, а некоторые.
![]() Это сообщение отредактировал(а) Girder - 27.4.2005, 23:57 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: Общие вопросы" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |