什么外部事件触发TCustomForm.RecreateWnd?

Ian*_*dby 7 windows delphi delphi-xe2

一个特定的VCL应用程序崩溃,很少,显然是自发的,我强烈怀疑这是因为主窗体的窗口句柄正在重新创建,以响应操作系统的一些外部触发器.

我确实知道,如果主窗体的窗口句柄要改变,那么肯定会出现麻烦(因为后台线程将消息发布到此句柄).

但我想知道如何在我开始修改代码之前重现这个bug,如果只是这样我可以确认这是崩溃的原因,症状与报告的那些匹配,并且代码变化确实解决了它.(如果操作系统无法触发呼叫,TCustomForm.RecreateWnd我需要找到崩溃的其他解释.是的,我可以发布CM_RECREATEWND到主表单,但这只是问题.)

(我知道将消息从后台线程发布到VCL线程的正确方法是创建一个纯粹用于此目的的隐藏消息窗口AllocateHWnd- 这是我提出的修复方法.)

我已经看到了一个类似的错误,通过将桌面样式从Windows XP更改为Windows Classic来触发TCustomListView其中的后代.但我还没有找到这样的方法来触发a .(我花了相当多的时间阅读VCL代码,但我必须遗漏一些东西.)RecreateWndRecreateWndTCustomForm

摘要:

在从操作系统是什么刺激并VCL的最终调用RecreateWnd一个TCustomForm?(如果这有所不同,我对Windows 7特别感兴趣.)

如果操作系统有这样的刺激,我可以证明它是否会导致观察到的症状.如果肯定没有,那么我可以证明窗口娱乐不是原因.

Ian*_*oyd 1

如果您的窗体拥有或属于另一个正在被销毁的窗口,则 Windows 将销毁您的窗体。

这将导致您的表单句柄被破坏。

但由于您的表单仍然存在,Delphi 将在下次重新创建句柄。