gpt4 book ai didi

winapi - Win32 CreateWindow() 调用在子线程中挂起?

转载 作者:行者123 更新时间:2023-12-05 09:25:32 26 4
gpt4 key购买 nike

我正在为 OpenGL 开发一个可移植层(为 Linux 和 Windows 抽象出 glX 和 wgl 的东西)...无论如何,它有一个创建窗口的方法...如果你不传入父级,你会得到一个带框架的真实窗口......如果你传入父级,你会得到一个无边框,无框架的窗口......

这工作正常,只要我在一个线程上完成这一切...只要另一个线程尝试创建子窗口,应用程序就会在 win32 调用“CreateWindow()”中死锁。有什么想法吗?

最佳答案

这不是一个真正的答案,但由于很多人似乎相信 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(或关闭控制台窗口)。

关于winapi - Win32 CreateWindow() 调用在子线程中挂起?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1759093/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com