检测窗口是否完成绘制并显示在屏幕上(WINAPI)

Detect if a Window is finished drawing and on screen (WINAPI)

本文关键字:屏幕 WINAPI 显示 是否 窗口 绘制 检测      更新时间:2023-10-16

我有一个问题。我在线程中创建了一个窗口。我创建了一个互斥锁,这样Window句柄就不能通过函数检索,直到它不为0。

我还使用了一个while循环来确保句柄不为0。

问题是,句柄永远不会为0,因为CreateWindowEx在窗口显示在屏幕上之前返回一个句柄给窗口。

我的互斥体和while循环失败了。我需要知道窗口何时完全显示并完成它必须做的事情,以便我可以从另一个线程绘制它。

句柄不为0,DC不为0。但是当我画的时候,它什么也没画。如果我在执行CreateWindowEx和ShowWindow后立即设置Sleep(100),则显示窗口并正确绘制图像。我也尝试在循环iswindowvisible (WindowHandle)。

我不想睡觉,我该怎么办?

不要尝试从另一个线程绘制窗口。

发送一些数据到窗口,并让它根据这些数据绘制自己。无论如何,它都需要准备好以响应WM_PAINT来绘制自己,并且需要在任何情况下这样做所需的任何数据。跳来跳去以不同的方式进行最初的绘图将会增加大量的工作,并且基本上没有任何回报。

还请注意,在您对消息队列执行某些操作之前,不会发生任何事情(窗口不会显示);即PeekMessage/GetMessageDispatchMessage。就像其他人说的,如果你要用GDI来画画,你必须用WM_PAINT。如果您想强制更新,请使用InvalidateRect。请记住,如果您尝试使用由其他线程创建的窗口,会遇到很多问题。