SetWindowsHook для поддержки как 32-битных, так и 64-битных приложений - PullRequest
1 голос
/ 20 декабря 2011

Я использую хук Windows в своем приложении, чтобы определить, был ли другой размер приложения изменен.Затем я предпринимаю некоторые действия в зависимости от нового размера другого приложения.

Это прекрасно работает в чистой 32-битной среде и чистой 64-битной среде (ловушка dll выполняется как 64-битная и 32-битная отдельно, как в документах MSDN).

Однако здесь есть проблема.Из-за сочетания 32-битного и 64-битного приложений, скажем, в Windows 64-битной ОС, если я запускаю 64-битную версию своего приложения, я не могу контролировать 32-битные приложения и наоборот.

Есть ли какой-нибудь хороший способ сделать это.Это может быть совершенно другой механизм.

1 Ответ

1 голос
/ 20 декабря 2011

К сожалению, вы можете вставлять только 32-битные DLL в 32-битные процессы и 64-битные DLL в 64-битные процессы.Это означает, что вам понадобятся 2 версии вашей DLL.Кроме того, SetWindowsHookEx () должен вызываться из того же семейства переносимых исполняемых файлов (то есть он должен вызываться из 32-разрядного кода для 32-разрядных процессов и аналогично для 64-разрядных процессов).

Учитывая, что ваше приложение является 64-битным, вам придется запустить экземпляр вашей 32-битной программы и установить его.Возможно, вы захотите иметь один из них в качестве child, который уведомит parent, когда интересующее вас событие было захвачено.

Из документов:

SetWindowsHookEx может использоваться для внедрения DLL в другой процесс.32-битная DLL не может быть внедрена в 64-битный процесс, а 64-битная DLL не может быть внедрена в 32-битный процесс.Если приложение требует использования хуков в других процессах, требуется, чтобы 32-разрядное приложение вызывало SetWindowsHookEx для внедрения 32-разрядной DLL в 32-разрядные процессы, а 64-разрядное приложение вызывало SetWindowsHookEx для внедрения 64-разрядногоDLL в 64-битных процессах.32-разрядные и 64-разрядные библиотеки DLL должны иметь разные имена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...