我在dcef3包中使用了屏幕外渲染组件TChromiumOSR
- Chromium-embedded
库的Delphi包装器。
FormA
包含TChromiumOSR
并绘制输出。 Modal FormB
通过对js
执行一些FormA.TChromiumOSR
代码来修改网页。
TChromiumOSR.OnPaint
事件(在FormA
)直到FormB.ShowModal
返回才触发。
TChromium
控制的情况下(在模态形式下)没有这样的问题。我假设``TForm.ShowModal'方法只阻止背景形式的输入,而不是绘画?
或者它是由cef3的内部工作引起的?
无论如何,如何解决?谢谢。
我已成功使用从模态窗体调用的ExecuteJavaScript方法更新HTML元素。但你可能也使用CEF V8(这是我没有测试过的)。对于需要手动使当前视图无效的情况,可以调用Invalidate:
MyChromiumOSR.Browser.Host.Invalidate(PET_VIEW);
但这是解决方法而不是解决方案。 CEF引擎应该为您发生相关元素的无效。如果您想出MCVE,我可以更多地调查您的具体问题。
好吧,我发现了问题的根源 - 它不是cef3或dcef3中的错误,而是由于我不正确地使用Delphi Event Bus引起的,以下是重现问题的步骤:
js
代码来更新dcef3
内的网页,这反过来将触发一些dcef3
事件(在主线程中),这里是程序卡住的地方 - 因为TEventBus.Post()
方法被TCriticalSection
锁定。解决方案:在步骤#1中,不要直接调用ShowModal
,而是使用PostMessage
winapi等技术来“延迟”执行ShowModal
。
我不确定我是否清楚地描述了它......