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

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

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

但是我想知道如何重现这个bug,然后才开始修改代码,以便修复它,如果只是这样,我可以确认这是崩溃的可能原因,症状符合那些报告,并且代码修改确实解决了这个问题。 (另外,如果操作系统没有办法触发TCustomForm.RecreateWnd的调用,我需要find一些其他的崩溃解释。是的,我可以将CM_RECREATEWND发布到主窗体,但这只是个问题。

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

我看到了TCustomListView的后代类似的错误,其中TCustomListView是通过将桌面样式从Windows XP更改为Windows Classic来触发的。 但我还没能find这样的方法来触发TCustomForm上的TCustomForm 。 (我花了相当多的时间阅读VCL代码,我一定会错过一些东西。)

概要:

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

如果有这样的操作系统的刺激,我可以certificate是否导致观察到的症状。 如果确切地说不是那么我可以certificate窗口娱乐不是原因。

Solutions Collecting From Web of "什么外部事件触发TCustomForm.RecreateWnd?"

如果Windows将被销毁,则Windows将销毁您的表单。

这将导致你的表单的句柄被销毁。

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