我正在使用代理 DLL 来拦截对CreateWindowExA
/CreateWindowExW
的调用。这很好用,除了一些应用程序(尤其是一些 Visual Basic 6 应用程序)似乎能够创建窗口而无需通过这两个函数中的任何一个。像Spy++这样的工具能够显示窗口,但我的钩子函数没有注意到它们。
我的第一个怀疑是,也许这些(旧)应用程序使用CreateWindowA
/CreateWindowW
来创建窗口,但至少对于我的编译器(MSVC6 到 MSVC10)来说,CreateWindow
这只是一个#define;文档的备注部分证实了这一点。
我的第二个想法是我可以安装一个CBT hook
usingSetWindowsHookEx
来检测 Windows 的创建。然而,结果是一样的:这个钩子注意到与我的钩子 API 函数相同的窗口,但它没有注意到在 Spy++ 中可见的所有窗口。
所以我的问题是:可能有一段时间CreateWindowA
/CreateWindowW
不是#define,而是一个真正的函数?此功能是否仍由 导出user32.dll
,也许是出于兼容性原因?我怎样才能得到这个函数的句柄来挂钩它?
或者是否有其他一些可能未记录的函数可用于创建函数,就像 egNtCreateProcess
可以用来代替CreateProcess
?