Ce n'est pas une vraie réponse, mais comme beaucoup de gens semblent croire que Win32 interdit de créer des enfants dans d'autres threads que le parent, je me sens obligé de poster une démonstration du contraire.
Le code ci-dessous illustre la création d'une fenêtre enfant sur un parent appartenant à un processus différent . Il accepte une valeur de handle de fenêtre en tant que paramètre de ligne de commande et crée une fenêtre enfant sur ce parent.
// 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;
}
compiler ce avec la commande suivante (en utilisant l'environnement de ligne de commande MSVC):
cl /EHsc /DUNICODE /D_UNICODE t.cpp user32.lib
utiliser ensuite Spy ++ ou un autre outil pour obtenir la valeur de la poignée d'une fenêtre - par exemple, du Bloc-notes ou du navigateur sur lequel vous consultez ce site. Supposons que c'est 0x000. Ensuite, exécutez l'exemple compilé avec t.exe 0x1234
. Utilisez Ctrl-C pour terminer t.exe (ou fermez simplement la fenêtre de la console).
Ce n'est pas ce que j'essaie de faire. Je veux que chaque thread prenne en charge SEULEMENT les fenêtres qu'il crée ... J'ai juste besoin de créer une fenêtre avec un parent créé par un autre thread ... – dicroce
Cela ne fonctionnera PAS. Vous ne pouvez pas créer une fenêtre parent dans un thread, puis créer une fenêtre enfant dans un autre thread.Ils DOIVENT être dans le même fil. –
Hmm ... Eh bien, je l'ai vraiment fait fonctionner ... Au fond, j'avais juste besoin de faire pomper le message des parents en pompant ... alors tout a commencé à fonctionner ... Mais vous êtes les commentaires qui m'inquiètent ... Êtes-vous sûr que c'est une mauvaise chose? – dicroce