SetWindowsHook支持32位和64位应用程序

SetWindowsHook支持32位和64位应用程序

问题描述:

我在我的应用程序中使用一个窗口挂钩来确定是否重新调整了其他应用程序的大小。然后根据其他应用程序的新大小采取一些行动。SetWindowsHook支持32位和64位应用程序

这在纯32位环境和纯64位环境(钩子dll编译为64位和32位,分别与MSDN文档中一样)中工作正常。

但是,这是问题所在。由于Windows 64位操作系统的32位和64位应用程序混合,如果我启动64位版本的应用程序,我无法监控32位应用程序,反之亦然。

有没有什么好的方法来做到这一点。它可以是一个完全不同的机制。

+0

你使用的是什么样的钩子? – 2011-12-20 12:54:48

+0

WH_CALLWNDPROCRET ... – Saibal 2011-12-20 12:58:18

+5

改为使用可访问性钩子。 – 2011-12-20 13:56:25

不幸的是,您只能将32位DLL注入32位进程,将64位DLL注入64位进程。这意味着您将需要2个版本的DLL。最重要的是,SetWindowsHookEx()必须从同一系列的可移植可执行文件中调用(也就是说,必须从32位代码调用32位进程调用SetWindowsHookEx(),类似地,调用64位进程)。

鉴于您的应用程序是64位的,您必须启动32位程序的一个实例并设置钩子。您可能希望将其中的一个作为child,通知parent您感兴趣的事件何时已被困住。

从文档:

SetWindowsHookEx函数可以用来注入一个DLL到另一个进程。 A 32位DLL无法注入到64位进程中,并且64位DLL 无法注入到32位进程中。如果应用程序需要在其他进程中使用钩子,则要求32位应用程序调用SetWindowsHookEx将32位DLL注入到32位 进程中,并且64位应用程序调用SetWindowsHookEx以注入 将64位DLL转换为64位进程。 32位和64位DLL必须有 不同的名称。

+0

谢谢!这就是我要去的方式......我希望有一个更优雅的解决方案。 – Saibal 2011-12-20 14:15:57