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

时间:2014-12-10 12:25:47

标签: windows delphi delphi-xe2

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

我确实知道如果主窗体的窗口句柄要改变那么麻烦肯定会随之而来(因为后台线程将消息发布到这个句柄)。

但是我想知道如何在我开始修改代码之前重现这个bug,如果只是这样我可以确认这是崩溃的原因,症状与报告的相符,并且代码更改确实修复了它。 (同样,如果操作系统无法触发对TCustomForm.RecreateWnd的调用,我需要为崩溃找到一些其他解释。是的,我可以将CM_RECREATEWND发布到主窗体但是这只是引出问题。)

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

通过将桌面样式从 Windows XP 更改为 Windows Classic TCustomListView,我发现了类似的错误RecreateWnd EM>。但我还没有找到这样的方法来触发RecreateWnd上的TCustomForm。 (我花了相当多的时间阅读VCL代码,但我必须遗漏一些东西。)

要点:

在操作系统的刺激下,VCL最终在RecreateWnd上调用TCustomForm? (如果有所不同,我对Windows 7特别感兴趣。)

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

1 个答案:

答案 0 :(得分:1)

如果您的表单被拥有或作为另一个正在被销毁的窗口的父级,Windows将销毁您的表单。

这将导致您的表单处理被破坏。

但是由于你的表单还在,Delphi会在下次重新创建句柄。