如何在不使用CreateWindow(Ex)的情况下创建一个窗口(HWND)
How can I create a window (HWND) without using CreateWindow(Ex)?
我正在使用代理DLL来拦截对CreateWindowExA
/CreateWindowExW
的调用。这很好用,除了一些应用程序(最值得注意的是一些Visual Basic 6应用程序)似乎能够在不通过这两个函数中的任何一个的情况下创建窗口。像Spy++这样的工具能够显示窗口,但我的钩子函数没有注意到它们。
我的第一个怀疑是,也许这些(旧)应用程序使用 CreateWindowA
/CreateWindowW
来创建窗口,但至少使用我的编译器(MSVC6 到 MSVC10),CreateWindow
只是一个 #define;文档的备注部分证实了这一点。
我的第二个想法是,我可以使用SetWindowsHookEx
安装一个CBT hook
来检测Windows的创建。但是,结果是相同的:这个钩子注意到与我的钩子 API 函数相同的窗口,但它没有注意到 Spy++ 中可见的所有窗口。
所以我的问题是:是否有一段时间CreateWindowA
/CreateWindowW
不是 #define,而是真正的功能?这个函数是否仍然由user32.dll
导出,也许是出于兼容性原因?如何掌握此函数以挂接它?
或者是否有其他一些可能未记录的函数可用于创建函数,就像例如 NtCreateProcess
可以代替CreateProcess
?
三个简单的猜测:
1)VB应用程序是否有可能真的在后台调用"DialogBox"API(例如DialogBoxParam,CreateDialogIndirect等)?
2) 您正在运行 64 位操作系统并挂接 64 位用户32.dll。 因此,32 位应用程序不会上钩。 在 c:\windows\syswow64 中有一个 user32.dll 的 32 位副本
3)您没有吸引用户32.dll应用程序正在使用。 许多较旧的应用程序可能会获得一些 DLL 重定向。 在命令提示符下,从 c:\windows\winsxs 目录中执行"dir/s user32.dll"。您将在此处看到至少一个 user32 的其他副本.dll。 忘记这种情况何时发生,但您可以必应"winsxs"并获得一些页面讨论并排目录如何解决较新的Windows操作系统版本的兼容性问题。
我怀疑#3是您问题的原因。
您的问题可能是VB应用程序正在使用GetProcAddress()来调用CreateWindow**()函数。如果你挂上了GetProcAddress,你应该能够确认这一点。
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- 如何在没有数据拷贝的情况下从指针创建一个Eigen VectorXd对象
- 是否可以在没有真实文件的情况下创建 ifstream
- 如何在不使用静态矩形方法的情况下创建 IDOMPathGeometryPtr?
- 在没有默认构造函数的情况下创建的派生对象
- 如何在没有侦听器的情况下创建 TCP 连接?
- 如何在不使用new的情况下保持在其他对象中创建的对象存活?
- 如何在不使用 std::tm 和 mktime() 的情况下为给定日历日期创建 chrono::time_point 对
- 我可以在不创建项目的情况下在Visual Studio 2019中编译和运行HelloWorld.cpp吗?
- 如何在不重新创建现有文件的情况下写入.txt文件
- 如何在不使用 "new" 关键字的情况下解除分配创建的对象的内存?
- 有没有一种方法可以在不复制数据的情况下从string_view创建字符串流
- C ++:如何在不创建对象的情况下在主函数中调用方法
- 在不创建新节点的情况下实现带有映射的trie
- 如何在不创建新配置的情况下对两个不同解决方案使用的一个项目使用不同的 #defines
- 如何在不使用宽字符串的情况下创建目录C++?
- 如何在不迭代的情况下从string_view向量创建字符串向量?
- 变量如何在不创建对象的情况下获得内存
- 在不创建子矩阵的情况下计算C++矩阵的行列式
- 如何在不以不同方式创建每个向量的情况下制作 2-D 向量列表?