Как я могу создать окно (HWND) без использования CreateWindow (Ex)?

I ' m с помощью прокси-библиотеки DLL для перехвата вызовов CreateWindowExA / CreateWindowExW . Это работает отлично, за исключением того, что некоторые приложения (особенно некоторые приложения Visual Basic 6), похоже, могут создавать окна, не выполняя ни одну из двух функций. Такие инструменты, как Spy ++ , могут отображать окно, но мои подключенные функции не заметили их.

Мое первое подозрение заключалось в том, что, возможно, эти (старые) приложения используют CreateWindowA / CreateWindowW для создания окон, но, по крайней мере, с моими компиляторами (от MSVC6 до MSVC10) CreateWindow - это просто #define; раздел примечаний в документации подтверждает это.

Моя вторая идея заключалась в том, что я мог бы установить ловушку CBT , используя SetWindowsHookEx для обнаружения создания окон. Однако результат тот же: этот хук замечает те же окна, что и мои подключенные функции API, но он не замечает всех окон, которые видны в Spy ++.

Итак, мой вопрос: было ли время, когда CreateWindowA / CreateWindowW было не #define, а реальной функцией? Эта функция все еще экспортируется user32.dll , может быть, из соображений совместимости? Как я могу получить дескриптор этой функции, чтобы перехватить ее?

Или, возможно, есть другая, возможно, недокументированная функция, которая может использоваться для создания функций, например, NtCreateProcess может использоваться вместо CreateProcess ?

10
задан Frerich Raabe 19 May 2011 в 06:10
поделиться