Delphi 德尔福,铬,标签和闪光故障

Delphi 德尔福,铬,标签和闪光故障,delphi,chromium,delphi-xe3,chromium-embedded,Delphi,Chromium,Delphi Xe3,Chromium Embedded,因此,我有一个项目,我需要有几个标签(TPageControl)与flash页面运行,并抓取他们的屏幕截图时,没有切换活动标签。 首先,我尝试了TChromiumOSR,但其中的闪光灯不可见,如果我点击页面按钮,打开一个最大化闪光灯的弹出窗口,就会有点效果。所以它看起来不像是闪光灯的问题,而是相框或其他东西的问题 然后我尝试了TChromium,一切正常,但我不知道如何在不切换选项卡的情况下抓取非活动TTabSheet上控件的屏幕截图 使用最新的dcef3中继 有什么想法吗?谢谢 编辑:原来在O

因此,我有一个项目,我需要有几个标签(TPageControl)与flash页面运行,并抓取他们的屏幕截图时,没有切换活动标签。 首先,我尝试了TChromiumOSR,但其中的闪光灯不可见,如果我点击页面按钮,打开一个最大化闪光灯的弹出窗口,就会有点效果。所以它看起来不像是闪光灯的问题,而是相框或其他东西的问题

然后我尝试了TChromium,一切正常,但我不知道如何在不切换选项卡的情况下抓取非活动TTabSheet上控件的屏幕截图

使用最新的dcef3中继

有什么想法吗?谢谢

编辑:原来在OSR中看不到flash是一个老的chromium bug。如果嵌入代码的“wmode”设置为“transparent”以外的值,它实际上正在播放,但不可见。我已经设法通过js更改了该属性。要真正看到更改,需要从DOM中删除flash对象并再次添加:

  chr1.browser.GetFrame(str[i]).ExecuteJavaScript('document.getElementsByName("wmode")[0].value="transparent";', '', 0);
  chr1.browser.GetFrame(str[i]).ExecuteJavaScript('document.getElementsByName("wmode")[1].value="transparent";', '', 0);
  chr1.browser.GetFrame(str[i]).ExecuteJavaScript('var wtf = document.getElementById("gameApp2");', '', 0);
  chr1.browser.GetFrame(str[i]).ExecuteJavaScript('document.getElementById("gameApp2").remove();', '', 0);
  chr1.browser.GetFrame(str[i]).ExecuteJavaScript('document.body.appendChild(wtf);', '', 0);

如果没有显示该选项卡(它不是前面的),则不会绘制该选项卡(这是操作系统的问题)。如果它没有被绘制出来,那么就没有任何截图可以捕捉


如果您的要求是在不显示Flash页面的情况下捕获Flash页面,那么您必须找到另一种方法。

假设您的Chrome仍然基于WebKit,我知道WebKitGTK有自己的快照引擎,如果它足够深入,也许您可以利用它进行捕获

TPageControl有一个行为问题,在选择选项卡之前,其子项都没有创建有效的句柄。我不知道情况是否仍然如此,但如果是这样,可能会使您不切换选项卡的愿望变得复杂


假设控件有一个有效的窗口句柄,您可以创建一个TBITMAP,锁定其画布,抓取画布的句柄(DC),并在控件上伪造一个WM_油漆,使其渲染到位图。

我看到有一个类型库“Shockwave Flash”,如果你让Delphi围绕它创建一个ActiveX包装并把它放在你的表单上,它会工作吗?不是真的,我正在自动化一个flash游戏,它需要作为一个包含所有cookies和东西的网页运行。你试过TWebBrowser吗?在使用OleDraw之前,我已经成功地从中抓取了快照:我以前使用过它,但它缺乏自动操作鼠标和键盘的能力,而且不像chromium那样便携。看起来我最终对osr的工作很在行。我希望通过屏幕外渲染模式实现这一点,因为浏览器使用TPaintBox32的画布,无论控件是否可见,都应该调用“绘制”。修复后,我可以抓取TChromiumOSR现在绘制的控件的画布/位图。谢谢你