Это не реальный ответ, но так как многие люди, похоже, считают, что 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 ++ или какой-либо другой инструмент, чтобы получить значение дескриптора любого окна - например, «Блокнот» или браузер, на котором вы просматриваете этот сайт. Предположим, что это 0x000. Затем запустите скомпилированный образец с t.exe 0x1234
. Используйте Ctrl-C для завершения t.exe (или просто закройте окно консоли).
Это не то, что я пытаюсь сделать. Я хочу, чтобы каждый поток заботился только о тех окнах, которые он создает ... Мне просто нужно создать окно с родителем, созданным другим потоком ... – dicroce
Это НЕ РАБОТАЕТ. Вы НЕ МОЖЕТЕ создать родительское окно в одном потоке, а затем создать дочернее окно в другом потоке.Они ДОЛЖНЫ быть в одной теме. –
Хм ... Ну, я на самом деле это заработал ... В принципе, мне просто нужно было перевести насос с насосами родителей ... тогда все начиналось ... Но ты меня беспокоишь ... Как вы уверены в том, что это плохо? – dicroce