Очередные приключения SetWindowsHookEx() в 64-битовой ОС
От: Kiper Израиль  
Дата: 17.08.10 09:32
Оценка:
Всем доброго времени суток. Хотел бы посоветоваться с людьми, понимающими в сабже. У меня Windows 7 64бит. Моя задача — добросовестно отлавливать сообщения мыши, разумеется, во всех процессах. Как сказано в MSDN (здесь ), если мы хотим, чтобы хуки работали как следует, то мы должны вызывать SetWindowsHookEx() отдельно для 32-х битных процессов и отдельно для 64-х. Все так и делаю — имею отдельно 32-битную DLL, отдельно 64-х битную, для чистоты эксперимента сделал их в разных проектах и ессно дал им разные имена. Все делаю по инструкции, и установка хуков, и обрабатывающая процедура находятся в самой DLL. И все это даже работает, но... по отдельности. Т.е. если я инсталлирую только 32-шку, то все 32-шные процессы отлавливают "мышиные события" очень корректно — именно в той моей соответствующей DLL, которая автоматически загрузилась системой в соответствующий процесс. Кстати, события в 64-битных процессах (при установленном только 32-битном хуке) тоже отлавливаются, но не корректно. Соответственно, и наоборот.
И точно так же отдельно для 64-ки — все 64битные процессы работают корректно. Но вот если я ставлю SetWindowsHookEx() и там и там, то начинаются казусы.
Например, у меня имеются Hook32.dll и Hook64.dll. Загружаю я их в разных экзешниках (само собой). Сначала ставлю хуки для 32-бит. Потом открываю любой 32-шный процесс(назовем его MyEdit32.exe), убеждаюсь, что все фурычит как надо. Для пущей уверенности запускаю ProcessExplorer и вижу, что моя Hook32.dll находится в списке загруженных модулей процесса MyEdit32.exe. Вот картинка для наглядности:


Теперь я все запускаю заново, ставлю хук для 32-бит, затем сразу для 64-бит. Снова запускаю MyEdit32.exe, открываю ProcessExplorer и ... не вижу своего Hook32.dll в списке загруженных модулей! Я начинаю яростно водить и щелкать мышкой над окном MyEdit32, в надежде, что система очухается и наконец подгрузит мой несчастный DLL, но не тут-то было. Система про нас забыла. Правда, события мыши все-таки отслеживаются и пересылаются системой, но только на процесс-инициатор.
Пока писал все эти мысли вслух и параллельно ковырялся в MSDN, наткнулся вот здесь на такую загадочную фразу: Be aware that the WH_MOUSE, WH_KEYBOARD, WH_JOURNAL*, WH_SHELL, and low-level hooks can be called on the thread that installed the hook rather than the thread processing the hook. For these hooks, it is possible that both the 32-bit and 64-bit hooks will be called if a 32-bit hook is ahead of a 64-bit hook in the hook chain. Только они забыли добавить: если вы ставите хуки для 32-бит, а потом для 64-х, то ваша 32-битная DLL-обработчик перестанет подгружаться ко всем(как я понял) 32-битным процессам. Можно попробовать инсталлировать хуки в обратном порядке, но это не помогает — тогда начинают страдать 64-битные процессы.
Прошу всех желающих высказаться.
Всем заранее спасибо.
Жизненный опыт похож на выигрышную лотерею, купленную после тиража.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.