これは本当の答えではありませんが、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 を終了します (または単にコンソール ウィンドウを閉じます)。