Это не реальный ответ, но так как многие люди, кажется, считают, что Win32 запрещает создавать детей в других потоках, кроме родительских, я чувствую себя обязанным опубликовать демонстрацию наоборот.
Приведенный ниже код демонстрирует создание дочернего окна для родителя, принадлежащего другому процессу . Он принимает значение дескриптора окна в качестве параметра командной строки и создает дочернее окно для этого родителя.
// t.cpp
#include <windows.h>
#include <stdio.h>
#define CLASS_NAME L"fykshfksdafhafgsakr452"
static LRESULT CALLBACK WindowProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
switch ( msg )
{
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_PAINT:
{
PAINTSTRUCT ps;
BeginPaint(hwnd, &ps);
EndPaint(hwnd, &ps);
break;
}
}
return DefWindowProc(hwnd, msg, wParam, lParam);
}
int main( int argc, char* argv[] )
{
HWND parent = (argc >= 2) ? (HWND)strtoul(argv[1], 0, 0) : (HWND)0;
printf("parent: 0x%x\n", parent);
WNDCLASS wc = {};
wc.lpfnWndProc = WindowProc;
wc.hInstance = (HINSTANCE)GetModuleHandle(NULL);
wc.lpszClassName = CLASS_NAME;
wc.hbrBackground = (HBRUSH)(COLOR_ACTIVECAPTION + 1);
if ( !RegisterClass(&wc) )
{
printf("%d: error %d\n", __LINE__, GetLastError());
return 0;
}
const DWORD style = WS_CHILD | WS_VISIBLE;
HWND hwnd = CreateWindow(CLASS_NAME, L"Test", style, 50, 50, 100, 100,
parent, 0, wc.hInstance, 0);
if ( !hwnd )
{
printf("%d: error %d\n", __LINE__, GetLastError());
return 0;
}
MSG msg;
while ( GetMessage(&msg, 0, 0, 0) )
DispatchMessage(&msg);
return 0;
}
Скомпилируйте это с помощью следующей команды (используя среду командной строки MSVC):
cl /EHsc /DUNICODE /D_UNICODE t.cpp user32.lib
Затем используйте Spy ++ или другой инструмент для получения значения дескриптора любого окна, например, Блокнот или браузер, в котором вы просматриваете этот сайт. Предположим, это 0x00001234. Затем запустите скомпилированный пример с t.exe 0x1234
. Используйте Ctrl-C для завершения t.exe (или просто закройте окно консоли).