Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
GOLD
Зарегистрирован: 04.04.2004 Сообщения: 13 Откуда: Москва
|
Добавлено: Ср Ноя 03 2004 11:17 Заголовок сообщения: Создание хука на клавиатуру |
|
|
Народ, помогите разобраться! Создаю программу для обработки нажатий мультимедийных клавиш. Я создаю глобальную ловушку, запихивая ее в dll, которую загружает моя программа.
В dll'ке я создал процедуру RunStopHook, которая в зависимости от переданного ей значения (true/false), загружает (SetWindowsHookEx) или выгружает(UnhookWindowsHookEx) мою ловушку. Так же в библиотеке находиться функция key_hook(code: integer; WPARAM: word; LPARAM: longint): longint - ловушка. Насколько я разобрался для отлова нажатий клавиш мне нужен только ее параметр wParam - виртуальный код клавиши.
Тут начинаются проблемы. Вообще про dll я не могу найти толком информации в книжках. Архангельский что-то начал было писать, но потом быстро это дело свернул, сказав, что это все устарело и пакеты круче.
Вот я создал окно своей программы. Там в разделе var, после Form1: TForm1; я прописал: procedure RunStopHook(State: boolean) stdcall; external 'NewkeyboardHook' index 1; (NewkeyboardHook - моя dll). При создании\закрытии формы я соответственно загружаю\выгружаю ловушку.
Что мне фактически от нее нужно? Только то, чтобы при нажатии клавиш их коды передавались в мою программу. Каким образом мне вообще передать значение из dll в программу. Я сделал это через еще одну функцию и присвоил ей значение wParam. Вставил на форму кнопку и при ее нажатии ее вызываю и вставляю ее значение в TEdit. Как сделать так, чтобы при нажатии клавиши на клаве срабатывала процедура в моей программе ? Знаю, что тупо сделал, но работает. Но отлавливает только нажатие в пределах этого же окна. Бред какой-то делал глобальную, получил локальную.
Что-то я совсем вошел в ступор и никак не разберусь.
Пишу на Delphi. |
|
Вернуться к началу |
|
|
DarkFlame Гость
|
Добавлено: Пн Ноя 08 2004 16:53 Заголовок сообщения: |
|
|
Глобально перехватывать нажатия клавиш из оконного приложения достачно сложно. Проще всего написать соответствующий сервис (File->New->Other->Service Application). А обмениваться данными с главной программой можно с помощью WinAPI SendMessage и события Application.OnMessage |
|
Вернуться к началу |
|
|
sars
Зарегистрирован: 13.11.2004 Сообщения: 4
|
Добавлено: Сб Ноя 13 2004 08:38 Заголовок сообщения: |
|
|
Сам-то я хуками и Delphi не сильно увлекаюсь, поэтому могу помочь только теоретически... При установке крючка функция ловушки подгружается в составе DLL, в адресное пространство процесса, на который и требуется поставить крючок. Весь Windows построен так, что два процесса фактически работают в разных адресных пространствах (адреса могут быть одни, но адресуют они совершенно разное). Код DLL вместе с данными полностью копируется в адресное пространство целевого процесса. Естественно, что при их разделенности вы не можете напрямую взаимодействовать ни с какими глобальными переменными, т.к. в разных процессах их разные копии. Есть несколько выходов из этого положения. Первый - завести в DLL разделяемый (расшаренный) сегмент данных, в котором хранить глобальные переменные. Это самое простое и самое плохое решение. Второе - хранить в этом разделяемом сегменте HWND какого-нибудт окна вашего (его обязательно надо будет создать, чтобы у первичного потока вашего приложения появились очереди сообщений) и слать из функции крючка сообщения этому окошку, которое берется из разделяемого сегмента данных (как его сделать на Delphi я не знаю). Для межпроцессной передачи данных можно использовать WM_COPYDATA. При этом все трудности по обходу несовместимости адресных пространств берет на себя ОС (создает MMF). Если вы используете VCL, то поймать такое сообщение поможет TApplicationEvents. _________________ С уважением, Роман |
|
Вернуться к началу |
|
|
GOLD
Зарегистрирован: 04.04.2004 Сообщения: 13 Откуда: Москва
|
Добавлено: Ср Ноя 17 2004 21:22 Заголовок сообщения: |
|
|
спасибо за ответы!
Ща всё осмыслю... |
|
Вернуться к началу |
|
|
|