如何在不使用CreateWindow(Ex)的情况下创建窗口(HWND)?

时间:2011-05-19 05:59:18

标签: c++ windows api hook api-hook

我正在使用代理DLL拦截对CreateWindowExA/CreateWindowExW的调用。除了某些应用程序(最值得注意的是一些Visual Basic 6应用程序)似乎能够创建窗口而不通过这两个函数中的任何一个之外,这样可以很好地退出。像Spy++这样的工具能够显示Window,但我的钩子函数没有注意到它们。

我的第一个怀疑是这些(旧的)应用程序可能使用CreateWindowA/CreateWindowW来创建窗口,但至少对于我的编译器(MSVC6到MSVC10),CreateWindow只是#define;文件的备注部分证实了这一点。

我的第二个想法是,我可以使用CBT hook安装SetWindowsHookEx来检测窗口的创建。但是,结果是一样的:这个钩子注意到与我的钩子API函数相同的窗口,但它没有注意到Spy ++中可见的所有窗口。

所以我的问题是:是否有一段时间CreateWindowA/CreateWindowW不是#define,而是一个真正的函数?此功能是否仍由user32.dll导出,可能是出于兼容性原因?如何处理此函数来挂钩它?

或者可能有一些其他的,可能没有记载的功能,可用于创建功能,就像例如可以使用NtCreateProcess代替CreateProcess

2 个答案:

答案 0 :(得分:6)

三个简单的猜测:

1)VB应用程序是否真的可以在引擎盖下调用“DialogBox”API(例如DialogBoxParam,CreateDialogIndirect等等)?

2)您正在运行64位操作系统并挂起64位user32.dll。因此,32位应用程序不会被吸引。在c:\ windows \ syswow64

中有一个32位的user32.dll副本

3)您没有挂钩应用正在使用的user32.dll。许多较旧的应用程序可能正在获得一些DLL重定向。在命令提示符下,从c:\ windows \ winsxs目录中执行“dir / s user32.dll”。您将在此处看到至少另一个user32.dll副本。忘记发生这种情况,但你可以Bing为“winsxs”并获得一些页面讨论并排目录如何解决更新的Windows操作系统版本上的compat问题。

我怀疑#3是你问题的原因。

答案 1 :(得分:1)

我认为您的问题可能是VB应用程序正在使用GetProcAddress()来调用CreateWindow **()函数。如果您挂钩GetProcAddress,您应该能够确认这一点。