Logo Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware
Архив форумов ЦИТФорума
Море(!) вопросов - Море(!) ответов
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 
Как правильно задавать вопросы

Создание хука на клавиатуру

 
Перейти:  
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование
Предыдущая тема :: Следующая тема  
Автор Сообщение
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 я не могу найти толком информации в книжках. Архангельский что-то начал было писать, но потом быстро это дело свернул, сказав, что это все устарело и пакеты круче. Sad
Вот я создал окно своей программы. Там в разделе 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    Заголовок сообщения: Ответить с цитатой

спасибо за ответы! Smile
Ща всё осмыслю... Shocked
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Показать сообщения:   
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2002 phpBB Group
Русская поддержка phpBB

 

IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
тел. +7 495 6608306, ICQ 232284597
Пресс-релизы — pr@citforum.ru
Послать комментарий
Информация для авторов
This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2006 CIT Forum
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...