WebBrowser控件和Adobe Flash内容

我有一个标准的WebBrowser控件,它已被修改为在边缘模式下使用IE11( 有关我如何操作的详细信息,请参见此处 )。

我无法在某些网站上播放Flash内容,其中一个值得注意的是BBC iPlayer和其他要求在BBC网站上提供Flash的媒体,我收到以下错误:

初始化播放器时出现问题。 您的浏览器拒绝访问脚本。

我可以使用Internet Explorer查看此内容,并在IE中启用脚本访问。 通过将ScriptErrorsSuppressed属性设置为true,可以在WebBrowser控件中抑制错误,即使设置为false,我仍然无法在BBC网站上查看媒体。

我安装了Flash版本17,0,0,188(撰写本文时的最新版本)。

如何使用WebBrowser控件查看BBC iPlayer?


更新:

我使用安装了Flash 15并且BBC​​ iPlayer和媒体工作的计算机对此进行了测试。 所以问题就在于这个版本的Flash,我想?

关于这个问题的一般共识是,它是一个长期存在的Flash bug,似乎永远无法解决。 您可以在此链接获得更多信息:

http://blogs.msdn.com/b/johan/archive/2009/08/06/problems-with-flash-content-in-the-webbrowser-control.aspx


它归结为缓存跨域ActiveX控件。 我还没有完全解决这个问题,但是发现在注册表中为WebBrowser控件设置一些function设置有所帮助。

似乎对我有影响的主要设置是:

 SOFTWARE\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_OBJECT_CACHING SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_OBJECT_CACHING 

MSDN: https : //msdn.microsoft.com/en-us/library/ee330729(v = vs.85).aspx #object_caching

我通过组策略将这两个设置为’0’。 我最终为HKCU和HKLM荨麻疹做了4次参赛(可能不需要,但我正在尝试一切)。


为了使用IE11,我还将通常的“FEATURE_BROWSER_EMULATION”设置为11000。

MSDN: https : //msdn.microsoft.com/en-us/library/ee330730(v = vs。85)。aspx #browser_emulation


还有这个设置应该过滤掉IE缓存:

 Software\Microsoft\Windows\CurrentVersion\Internet Settings\MimeExclusionListForCache 

附加’application / x-shockwave-flash’应该可以防止flash对象的缓存,但是我没有看到任何帮助。


这些是我也应用的一些组策略设置:

ActiveX的IE组策略设置


有一天,我有点疯狂,并尝试更改所有设置进行测试。 这是我通过组策略修改的注册表设置的屏幕截图:

WebBrowser控件的注册表设置


即使在完成所有这些工作之后,我也只能从Facebook(我用来测试的那个)获取video加载一次,后续video失败。 但是,重新启动应用程序似乎有效。 这是不可接受的,但这是我目前所能达到的。

有人提到清除导航缓存可以解决问题,但我没有采用这种方法,因为我认为它会减慢浏览体验。 如果你只清除缓存的flash对象,这种方法可能会很好,但同样,我没有测试过。

我更喜欢每次启动控件时加载来自IE Cache的swf文件并加载带有flash激活内容的页面:

 private void ClearCachedSWFFiles() { try { var cachefolder = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) + "\\Microsoft\\Windows\\INetCache\\IE"; var dirinfo = new DirectoryInfo(cachefolder); foreach (var directoryInfo in dirinfo.GetDirectories()) { foreach (var fileInfo in directoryInfo.GetFiles("*.swf")) { fileInfo.Delete(); } } } catch (Exception ex) { throw ex; } }