Всем доброго времени суток. Хотел бы посоветоваться с людьми, понимающими в сабже. У меня 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-битные процессы.
Прошу всех желающих высказаться.
Всем заранее спасибо.