Привет всем. HELP! ;-0 Пишу DLL для работы с хуками (VC++ v6). DLL должна создавать хук (в задумке любой из SetWindowsHookEx), причем в EXE-шнике нужно только знать адреса нескольких функций из DLL. Есть 2 (позже, возможно, будут еще) варианта обработки хука: Первый - как обычно, создается процедура обработки, вызываем DSInstallHook (в смысле, мою функцию) и усе. Вот только процедура обработки может находится где угодно (не обязательно в DLL)! Реализуется так: в моей DLL лежит реальная процедура, которая и вызывает ... Второй - хук обрабатывается оконной процедурой. () ;-\ Т.е., реально,хук обрабатывается в моей DLL, и через SendMessage играем ... Столкнулся с алгоритмической проблемой. Хотелось бы узнать, можно ли ее решить (ессно, как тоже хотелось бы узнать :=)). Суть вот в чем: есть DLL, при загрузке инициализируется общая память (через CreateFileMapping), каждая следующая DLL получает доступ ко всей памяти (read-write). В DLL никакой информации о хуках не хранится - все в общей памяти. В этой памяти: - заголовок: ;-| struct MEMFILEHEADER{ WORD bVersion; //version of DSLib that created this file DWORD dwFileSize;//memory file size DWORD dwLoadedProcessCount;//links to this file DWORD dwHooksCount;//hooks count //reserved to future ... };//MEMFILEHEADER - массив из структур, описывающих конкретный хук: ;-| struct DSHOOKINFO{ BOOL fUsed;//is this record used ?? DWORD dwDSHookId;//DSLib hook ID. It's not equal dwHookId! /*!!!!!*/ HHOOK dwHookId;//hook id. This value returns the SetWindowsHookEx DWORD dwDSLibraryID;//DS Library Id that was install the hook DWORD dwHookType;//what we're hooking BYTE bHookMethod;//hook method DWORD dwThreadId;//thread ID to install hook for HWND hWnd;//window handle that receive the message UINT uMsg;//message to be send to hWnd HOOKPROC dwHookProc;//user hook procedure };//HOOKINFO dwHookId нужен для вызова внутри моих обработчиков (для CallNextHookEx). Дело в том, что сохраняться то он сохраняется в общей памяти, но DLL подгружается ко всем процессам в системе (т.е. у них разное адресное пространство!) и нельзя (или можно ??) узнать какой процесс какой хук установил! Могу сделать так, чтобы DLL видела все свои хуки, но как из них выбрать нужный?? КАК ВНУТРИ ОБРАБОТЧИКА ХУКА УЗНАТЬ ЕГО HHOOK??????? ВОПРОС: Есть ли решение (и какое) моей проблемы?) ВОПРОС: Может есть другие методы? ;\ PS: Не ругайте сильно (то что я дурак - это я и сам знаю ж-)), но помните, что "чем меньше прыщь, тем больше пыжится!" ), ну очень хочется, например, подгрузить DLL, вызвать функцию и обрабатывать событие перемещения мышки по экрану (!) в оконной процедуре ... ;-\ PPS: Сгодится любая критика, советы и т.д. ;/
нихренаськи не понятна проблема. если хочется: >например, подгрузить DLL, вызвать функцию и обрабатывать >событие перемещения мышки по экрану (!) в оконной >процедуре ... ;-\ то можно подгрузить длл, найти окно, чьи сообщения нужно перехватывать. Далее этому окну сделать SetWindowLongPtr Указать свою функцию. В ней уже обрабатывать все сообщения.
Да не ... ;\ Энто я уже сделал. Дело в том, что я хочу чтобы хук можно было обрабатывать не в отдельной процедуре, а В ОКОННОЙ ПРОЦЕДУРЕ ! И все это благодаря моей DLL. ;p Проблема вот теперь в чем. Оконной процедуре посылается сообщение через SendMessage(). Как из оконной процедуры вернуть значение, чтобы его вернула SendMessage()??? ;-/
Чтобы узнать HHOOK внутри обработчика надо его передвать в процесс куда внедряется длл. Это можно сделать через маппинги. Если юзать хуки в НТ, то можно ничего не передавать, а просто ставить 0 вместо HHOOK.