![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#11 | |
Пользователь
Регистрация: 26.10.2007
Сообщений: 79
|
![]() Цитата:
![]() |
|
![]() |
![]() |
![]() |
#12 |
Регистрация: 25.10.2007
Сообщений: 7
|
![]() |
![]() |
![]() |
![]() |
#13 |
Пользователь
Регистрация: 26.10.2007
Сообщений: 79
|
![]() |
![]() |
![]() |
![]() |
#14 |
Регистрация: 25.10.2007
Сообщений: 7
|
![]() |
![]() |
![]() |
![]() |
#15 | |
Пользователь
Регистрация: 26.10.2007
Сообщений: 79
|
![]() Цитата:
![]() 1. Адресные пространства процессов изолированы друг от друга. Адрес памяти в одном процессе, невалиден в другом. 2. При загрузки DLL ее образ проецируется на адресное пространство (далее АП) загружающего процесса. 3. Установка хука с помощью SetWindowsHookEx не приводит к загрузке библиотеки в адресные пространства всех процессов. Ее загрузит только тот процесс, который ее установил. Потом уже каждый процесс, инициирующий срабатывание ловушки при этом самостоятельно загружает библиотеку в свое адресное пространство. Т.е. как только какое-либо ваше приложение получит клавиатурныйй ввод - в этот момент оно загрузит в свое АП библиотеку с ловушкой. Вот это очень важно понимать. ФУНКЦИЯ ЛОВУШКИ ВЫПОЛНЯЕТСЯ НЕ В КОНТЕКСТЕ УСТАНОВИВШЕГО ЕЕ ПРОЦЕССА, А В КОНТЕКСТЕ ПРОЦЕССА, КОТОРЫЙ ЕЕ (ЛОВУШКИ) ВЫЗОВ ИНИЦИИРОВАЛ!!! 4. Глобальные переменные (коей в статьях объявлен дескриптор ловушки) хранятся в разделе данных DLL-файла, попытка записи в который приводит не к записи в файл непосредственно, а к копированию куска файла в память, проецированию его в закрытое АП процесса, и модификации этой копии в памяти. Другими словами, изменение переменной в библиотеке, загруженной одним процессом, никак не скажутся на значение этой переменной в библиотеке, загруженной другим процессом. Из этого видно, что присваивает значение переменной-дескриптору тот процесс, который ловушку устанавливает. А CallNextHookEx вызывает тот процесс, который инициировал срабатывание ловушки. В общем случае это может быть любой процесс, не обязательно тот, который ловушку установил. А раз так, то значение глобальной переменной дескриптора в его адресном пространстве оказывается неинициализированным, т.е. равным нулю. Вы передаете первым параметром CallNextHookEx ноль, вместо действительного значения дескриптора. Разумеется функция срабатывает неправильно. Все, что я описал, подробно описано здесь: http://www.delphikingdom.com/asp/vie...?catalogid=548 На данный момент, это единственная известная мне "правильная" статья по хукам. К сожелению... |
|
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Имитация нажатия клавиш | Air | Свободное общение | 28 | 04.02.2010 12:38 |
У меня возникла небольшая проблемка с определением последнего активного окна. | hoza_syl | Помощь студентам | 6 | 23.05.2008 17:03 |
Эмуляция нажатия нескольких клавиш | -=Shad0www | Общие вопросы Delphi | 3 | 12.05.2008 08:13 |
Имитация нажатия комбинации клавиш | Zeraim | Win Api | 15 | 05.05.2008 20:35 |
программа по эмуляции нажатия клавиш | sr_lexx | Win Api | 3 | 03.12.2007 15:40 |