|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
26.10.2007, 18:42 | #11 | |
Пользователь
Регистрация: 26.10.2007
Сообщений: 79
|
Цитата:
|
|
26.10.2007, 21:33 | #12 |
Регистрация: 25.10.2007
Сообщений: 7
|
|
26.10.2007, 21:46 | #13 |
Пользователь
Регистрация: 26.10.2007
Сообщений: 79
|
|
27.10.2007, 12:23 | #14 |
Регистрация: 25.10.2007
Сообщений: 7
|
|
27.10.2007, 17:28 | #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 |