WebBrowser Control 和 Adob​​e Flash 内容

WebBrowser Control and Adobe Flash content

我有一个标准 WebBrowser 控件,已修改为在边缘模式下使用 IE11 (see here for details for how I did that)。

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

There was a problem initialising the player. Script access is denied in your browser.

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

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

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


更新:

我使用安装了 Flash 15 且 BBC iPlayer 和媒体正常运行的计算机对此进行了测试。所以我猜问题出在这个版本的 Flash 上?

关于此问题的普遍共识是,这是一个长期存在的 Flash 错误,似乎他们永远不会解决。您可以在此 link:

获得更多信息

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


归结为缓存跨域 ActiveX 控件。我尚未完全解决此问题,但发现在注册表中为 WebBrowser 控件设置一些功能设置有所帮助。

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

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 对象,但我还没有看到这有什么帮助。


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


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


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

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

我更喜欢在每次启动控件并加载具有 Flash 激活内容的页面时从 IE 缓存中清除 swf 文件:

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;
    }
}