Delphi XE2,vcl样式重新创建窗口句柄

Delphi XE2,vcl样式重新创建窗口句柄,delphi,delphi-xe2,vcl-styles,Delphi,Delphi Xe2,Vcl Styles,在运行时应用新样式后,我的应用程序的MainForm将创建一个新的窗口句柄–当我遇到大量以下错误时,是否有方法停止此操作或重新分配句柄: '系统错误。代码:1400。无效的窗口句柄' 有没有办法操纵强制分配新句柄的进程 我通过以下方法解决了此问题: 我的主窗体创建了一个看不见的“helper”窗体,该窗体从不显示,但有可视组件-它在尝试重新绘制这些可视组件时抛出了句柄错误,因此我将相关组件替换为对象(注意,我最初并没有编写此代码).无法避免重新创建窗口句柄。相反,重写窗口的CreateWnd和d

在运行时应用新样式后,我的应用程序的MainForm将创建一个新的窗口句柄–当我遇到大量以下错误时,是否有方法停止此操作或重新分配句柄:

'系统错误。代码:1400。无效的窗口句柄'

有没有办法操纵强制分配新句柄的进程

我通过以下方法解决了此问题:


我的主窗体创建了一个看不见的“helper”窗体,该窗体从不显示,但有可视组件-它在尝试重新绘制这些可视组件时抛出了句柄错误,因此我将相关组件替换为对象(注意,我最初并没有编写此代码).

无法避免重新创建窗口句柄。相反,重写窗口的
CreateWnd
destrownd
方法,以便在重新创建窗口时收到通知

另外,避免保留对可能被破坏的窗口句柄的持久引用。相反,每次需要时,请阅读
句柄
属性。这样你就不必关注通知了


不过,请注意从不同的线程读取
句柄
,因为这可能会导致窗口与错误的线程关联。将需要与VCL窗口交互的任何代码包装到通过
Synchronize
Queue

调用的方法中。不要存储窗口句柄的副本(尤其是在线程中),请参阅。是,有避免这种情况的方法。如果你能告诉我们为什么会这样,我们可以帮你。那么,为什么会有一个陈旧的窗口句柄呢?FWIW,在Delphi10.4中更改样式也会更改主窗体的句柄。如果需要确定表单句柄,我将重新使用EnumWindows,不再存储它们。