Как я могу создать окно (HWND) без использования CreateWindow(Ex)?
Я использую прокси DLL для перехвата вызовов CreateWindowExA
/ CreateWindowExW
, Это хорошо работает, за исключением того, что некоторые приложения (особенно некоторые из приложений Visual Basic 6), похоже, могут создавать окна, не выполняя ни одну из двух функций. Такие инструменты, как Spy++, могут отображать окно, но мои подключенные функции их не заметили.
Мое первое подозрение было, что, возможно, эти (старые) приложения используют CreateWindowA
/ CreateWindowW
для создания окон, но по крайней мере с моими компиляторами (от MSVC6 до MSVC10), CreateWindow
это просто #define; раздел примечаний документации подтверждает это.
Моя вторая идея заключалась в том, что я мог бы установить CBT hook
с помощью SetWindowsHookEx
обнаружить творения окон. Тем не менее, результат тот же: этот хук замечает те же окна, что и мои перехваченные функции API, но он не замечает все окна, которые видны в Spy++.
Итак, мой вопрос: было ли время, когда CreateWindowA
/ CreateWindowW
был не #define, а реальная функция? Эта функция все еще экспортируется user32.dll
может по соображениям совместимости? Как я могу получить дескриптор этой функции, чтобы подключить ее?
Или есть какая-то другая, возможно недокументированная, функция, которая может использоваться для создания функций, например, например, NtCreateProcess
можно использовать вместо CreateProcess
?
2 ответа
Три простых догадки:
1) Возможно ли, что приложения VB действительно вызывают API DialogBox (например, DialogBoxParam, CreateDialogIndirect и т. Д.) Под капотом?
2) Вы работаете в 64-битной ОС и подключаете 64-битную user32.dll. 32-битные приложения не зацепляются в результате. В каталоге c:\windows\syswow64 есть 32-битная копия user32.dll.
3) Вы не перехватываете user32.dll, который используют приложения. Многие старые приложения могут получить перенаправление DLL. Из командной строки выполните "dir /s user32.dll" из каталога c:\windows\winsxs. Вы увидите по крайней мере еще одну копию user32.dll здесь. Забудьте, когда это произойдет, но вы можете использовать Bing для "winsxs" и обсудить на нескольких страницах, как параллельный каталог решает проблемы с компатом в новых выпусках ОС Windows.
Я подозреваю, что № 3 является причиной вашей проблемы.
Я думаю, что ваша проблема может быть в том, что приложение VB использует GetProcAddress() для вызова функции CreateWindow**(). Если вы перехватите GetProcAddress, вы сможете это подтвердить.