Форум: "Основная";
Текущий архив: 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