Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.05.02;
Скачать: [xml.tar.bz2];

Вниз

Клавиатурный хук не ловит первую букву в каждом новом окне   Найти похожие ветки 

 
demonyator ©   (2004-04-15 15:00) [0]

Внизу код dll. Всё работает прекрасно, за исключением того, что при переключении пользователя в новое окно, хук не ловит первую букву. То есть, если пользователь зайдёт в notepad и напишет hello, затем перейдёт в Word и опять напишет hello, то хук словит такую комбинацию: helloello, вместо hellohello. Помогите решить проблему.


library hook;
uses
 Windows,
 SysUtils;

var
 CurrentHook: HHook;

function GlobalKeyBoardHook(code: integer; wParam: integer; lParam: Integer): longword; stdcall;
begin
 if (Code = HC_ACTION) and (((lParam shr 16) and KF_UP) = 0) then begin
   Здесь я обрабатываю Chr(WParam) для получения нажатого символа
 end;
 Result := 0;
end;

procedure SetupGlobalKeyBoardHook;
begin
 CurrentHook := SetWindowsHookEx(WH_KEYBOARD, @GlobalKeyBoardHook,HInstance, 0);
end;

procedure UnHook;
begin
 UnhookWindowshookEx(CurrentHook);
end;

exports
SetupGlobalKeyBoardHook, UnHook;
begin
end.


 
VMcL ©   (2004-04-15 15:06) [1]

>>demonyator ©  (15.04.04 15:00)

FAQ. CurrentHook - должна находиться в разделяемой области памяти.


 
Юрий Зотов ©   (2004-04-15 15:19) [2]

Начнем с того, что хук написан неверно.

1. Нет вызова CallNextHookEx - то есть, возможны любые глюки.
2. Переменная CurrentHook не является глобальной на уровне всей системы - то есть, CallNextHookEx нормально работать не сможет.

Читайте статью Алексея Павлова на этом сайте.


 
demonyator ©   (2004-04-15 17:06) [3]

Спасибо, буду читать.


 
demonyator ©   (2004-04-15 22:17) [4]

Прочитал статью, что-то не всё понятно. Может быть есть пример какой-нибудь в сети?


 
Rouse_ ©   (2004-04-15 22:42) [5]

Не внимательно читал, прочитай еще раз этот отрывок:

В первом приближении работу механизма MMF можно представить следующим образом: Process1 создаёт отображение, которое связывает с некими данными (будь то файл на диске или значение неких переменных в самом Process1) и может изменять отображённые данные; затем Process2 так же отображает некие свои данные в тоже отображение, что и Process1, таким образом, изменения, внесённые Process1 в отображённые данные, будут видны Process2 и наоборот (см. рис.1 - красный овал c именем Global Data и есть зарезервированное под совместные нужды двух процессов АП). Данное приближение, вообще говоря, грубое, потому что всё намного сложнее, но для наших "нужд" этого будет вполне достаточно. Мы не будем создавать никаких временных файлов для передачи информации между процессами, мы воспользуемся файлом подкачки Windows (файл страничного обмена), таким образом, нам не придётся ни создавать ни уничтожать файлы, а придётся просто создать некоторое АП, которое будет доступно нашим приложениям и которое будет автоматически освобождаться системой, когда в нём отпадёт необходимость. К тому же, ясно, что работа с файлом подкачки куда быстрее, чем с обычным файлом, хранящимся на диске. Таким образом, к рассмотренному вами ранее Example1 можно применить следующий сценарий: при загрузки вашей программой (MainProg1.exe) библиотеки hook_dll1.dll эта библиотека создаёт отображённый в память файл, в котором сохраняет значение дескриптора установленной ловушки; затем некий процесс, в котором произошло событие, на которое была установлена ловушка, отображает на своё АП код hook_dll1.dll и уже новый экземпляр hook_dll1.dll, находящийся в АП другого процесса использует то же отображение, что и библиотека, из который была установлена ловушка, т.е. будет иметь доступ к сохранённому значению дескриптора установленной ловушки. Таким образом, вызов функции CallNextHookEx(Hook_Handle, Code, wParam, lParam); будет происходить вполне корректно, т.к. значение Hook_Handle будет содержать не 0, как в примере1, а значение, возвращённое функцией SetWindowsHookEx из первого экземпляра DLL. Возможно, данные объяснения кажутся вам запутанными, но после просмотра примера и повторного прочтения этих объяснений всё встанет на свои места.

Теперь пару слов о программной реализации всего вышесказанного.

CreateFileMapping() Создаёт объект файлового отображения. Данная функция возвращает указатель (handle) на объект файлового отображения.
MapViewOfFile() Данная функция отображает образ объекта файлового отображения на АП процесса, из которого она была вызвана. Первым параметром данной функции является результат выполнения функции CreateFileMapping(). Результатом работы данной функции является указатель на начало выделенного АП (уже в том процессе, из которого была вызвана данная функция). См. рис.1. - красные овалы в Process1 и Process2 под названием GD1 и GD2 (Global Data 1/2). Следует отметить, что для различных процессов, использующих экземпляры одной и той же DLL, адреса выделенных областей будут различными (хотя могут и совпадать, но это совпадение носит вероятностный характер), хотя данные, на которые они будут ссылаться, одни и те же !
UnmapViewOfFile() Данная функция закрывает отображённый в память файл и освобождает его дескриптор. При удачном закрытие функция возвращает ненулевое значение и 0 в случае неудачи.


а также не разглядел ты и пример идущий вместе со статьей
http://www.delphimaster.ru/articles/hooks/example.zip



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2004.05.02;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.057 c
14-1081658051
Vaitek
2004-04-11 08:34
2004.05.02
Мелкософт блин совсем жадный стал.


6-1078696226
kat
2004-03-08 00:50
2004.05.02
Код открывающий доступ к логическим дискам


14-1081374394
Феликс
2004-04-08 01:46
2004.05.02
Анимация для игр


1-1081772016
ss300
2004-04-12 16:13
2004.05.02
Обработка TEdit


1-1081844252
Dimerol
2004-04-13 12:17
2004.05.02
Management памяти.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский