Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Delphi: Общие вопросы > Делаю ловушку на клаву |
Автор: Budy 20.4.2005, 08:58 |
:Приветсвую Делаю ловушку на клавиатуру. Использую Hook, использую DLL. Все норм работает, но есть проблема - при запуске проги все тормозит. TaskMan 100%ую загрузку ЦП показывает. Видать получился глобальный Хук, а хотелось чтоб не тормозило. Помогите плз |
Автор: Akella 20.4.2005, 09:48 |
Я тоже когда-то пытлся делать ловушки, осталось вот несколько примеров, незабывай проверять раскладку клавиатуры. |
Автор: Bes 20.4.2005, 12:50 |
Можно использовать getkeystate тогда и без дллки обойтись можно. |
Автор: RA 20.4.2005, 15:32 |
Budy Покажи код. |
Автор: Budy 20.4.2005, 17:21 | ||||
Прога, запускающая DLL'ку:
Прога в памяти весит, всего около 300 Кб имеет. А вот DLL'ка:
PS.В коде (здесь строки 75-76) пробовал писать Result:=CallNewxt...... Тогда клавиши не возращаются нужным приложениям. Bes, расскажи поподробнее. Просто пробовал в EXE'шник пихнуть - когда на клаве щелкаешь кнопки при других окнах, они закрываются. |
Автор: RA 20.4.2005, 17:28 |
Убери repeat until false; |
Автор: Budy 20.4.2005, 19:20 |
RAdmin, дык тогда ничего работать и не будет |
Автор: RA 20.4.2005, 20:15 |
Ты пробовал? |
Автор: RA 20.4.2005, 20:48 |
То верхнее это моя оценка на вскидку. А вот специально решил посмотреть что к чему: Почему в 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 21.4.2005, 14:43 | ||||
RAdmin, я с "HK" и "hook" перепутал, короче это одна и та же переменная, иначе "hook: HHOOK;" AddKey - здесь я сохраняю клавиши в оперативную память, пробовал в файл сохранять - возникают проблемы из за загрузки ЦП. Добавлено @ 14:45
Дак прога тогда закрывается. |
Автор: Budy 21.4.2005, 15:23 | ||
Работать то работает, да вот память сильно грузит :\ |
Автор: RA 21.4.2005, 15:52 |
Budy Ну не знаю, то что я проверял работало без напрягов. Пришли мне на мыло весь исходник, или тут выложи (только в аттаче). exxxxx [a] gmail.com |
Автор: Budy 21.4.2005, 18:52 |
RAdmin, дак я весь и выложил. Есть прога (там всего 5 строчек), которая запускает DLL и держит его в памяти. DLL в свою очередь ставит ловушку, и проверяет на нажатие клавиш на клавиатуре. Три процедуры, что я не расписывал не представляют из себя ничего серьезного - у все сводил к минимуму, просто получал Key_Name (GetKeyNameText(lParam, Key_Name, sizeof(Key_Name));) и записывал в файл. Всеравно всю память использует. Может ловушка "слишком много на себя берет"? |
Автор: Budy 21.4.2005, 20:55 | ||
Ага, в этом все и дело. Я переделал запускающую прогу чтоб без зацикливания была, все встало на место Добавлено @ 20:57 А я себе в голову вбил, что ето все DLL'ька виновата ![]() |
Автор: RA 22.4.2005, 15:44 |
ну вот и замечательно ![]() |
Автор: Budy 25.4.2005, 06:25 |
А как мона сделать чтоб DLL передавала какието параметры вызвающей программе? Ну например в этом случае, DLL получила клавишу и нужно ее передать программе.. |
Автор: RA 25.4.2005, 14:01 |
Вот есть хороший пример: |
Автор: vintch 25.4.2005, 14:31 | ||||
Это в Win-проге использовать просто нельзя! ![]() Нужно:
PS. SetTimer и всё что с ним связано - чисто для показухи ![]() |
Автор: Budy 25.4.2005, 14:51 |
vintch, ага, я уже понял ![]() |
Автор: Dr.No_xXx 25.4.2005, 15:03 | ||
Зачем? и какие именно? |
Автор: Budy 25.4.2005, 16:36 |
RAdmin, я мона полегче примерчик? Я шото там запутался ![]() Dr.No_xXx, посмотри эту тему. Я кидал код, там процедуре "procedure AddKey(Key: String);" я передаю полученную нажатую клавишу. Дак вот спрашиваю, как эту "Key: String" - клавишу передать в главную прогу? |
Автор: Rouse_ 26.4.2005, 08:33 | ||||
Ты работаешь под NT? Если так то не нужны никакие лишние DLL. Вот смотри примерчик:
|
Автор: vintch 26.4.2005, 13:34 |
Да, признаться, давно я на MSDN небыл ![]() Rouse, ещё новичком себя называет ![]() PS. А можно ещё так: не repeat until false; а repeat sleep(10) until false; ![]() ![]() |
Автор: Rouse_ 26.4.2005, 15:29 | ||
Ну можно и application.HandleMessage или ее аналог написать. Самый ненапряжный вариант ![]() |
Автор: Rouse_ 26.4.2005, 20:03 | ||||||||||||||
Ну чтож, давайте теперь разберем ошибки. 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. Ну это немного не из той серии, но очень грамотно написаный пример... Мой пост собственно не указание на ошибки, а указание на возможные неприятности при бездумном использовании кода... |
Автор: RA 26.4.2005, 20:54 | ||||
Дык человек вопрос задал :
Естесно потом возникнет вопрос а как текст передать. и тд. А что касатется хука на клаву то мой пример уже давно пылится в кладовке. (тотже принцип что и у тебя, толкьо с перламутровыми пуговицами ) |
Автор: Budy 27.4.2005, 10:33 |
RAdmin, Rouse_, пасибо, ребята! Оба помогли, у обоих код позаимствовал ![]() |
Автор: Denis-delphist 27.4.2005, 18:28 |
Уменьшь её на сколько можно и пусть результат не в прогу пишется, а в LOG файл, не указывая время(Только беквы и цифры). Ещё можно эту штуку коммандной строкой сделать!!! Также можно сделать так, чтобы не все буквы запоминались, а некоторые. ![]() |