繁体   English   中英

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

[英]How can I create a window (HWND) without using CreateWindow(Ex)?

我正在使用代理DLL拦截对CreateWindowExA / CreateWindowExW调用。 除某些应用程序(最著名的是一些Visual Basic 6应用程序)似乎能够创建窗口而无需通过这两个功能中的任何一个功能之外,该工作效果很好。 Spy ++这样的工具都可以显示Window,但是我的钩子函数却没有注意到它们。

我的第一个怀疑是,也许这些(旧的)应用程序使用CreateWindowA / CreateWindowW创建窗口,但是至少对于我的编译器(MSVC6至MSVC10)而言, CreateWindow只是#define; 文档的备注部分对此进行了确认。

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

所以我的问题是:是否可能有一段时间CreateWindowA / CreateWindowW不是#define,而是真正的函数? 还是出于兼容性原因,此函数是否仍由user32.dll导出? 如何获取此函数的句柄以将其挂钩?

或者是否存在其他一些可能未记录的函数可用于创建函数,例如可以使用NtCreateProcess代替CreateProcess

三个简单的猜测:

1)VB应用程序是否真的在后台调用了“ DialogBox” API(例如DialogBoxParam,CreateDialogIndirect等)?

2)您正在运行64位操作系统,并且正在挂接64位user32.dll。 因此,不会吸引32位应用程序。 在c:\\ windows \\ syswow64中有一个user32.dll的32位副本

3)您没有钩住应用程序正在使用的user32.dll。 许多较旧的应用程序可能正在获得某些DLL重定向。 在命令提示符下,从c:\\ windows \\ winsxs目录执行“ dir / s user32.dll”。 您将在此处看到至少一个其他的user32.dll副本。 忘记这种情况了,但是您可以Bing for“ winsxs”,并获得一些页面来讨论并行目录如何解决较新的Windows OS版本上的兼容性问题。

我怀疑#3是您遇到问题的原因。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM