WebBrowser控件和Adobe Flash内容

时间:2015-05-16 19:14:44

标签: c# winforms .net-4.0 webbrowser-control flash

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

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

  

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

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

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

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

更新

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

2 个答案:

答案 0 :(得分:2)

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

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'。我最终有4个条目,因为我为HKCU和HKLM荨麻疹做了(可能不需要,但我正在尝试一切)。

我还将通常的'FEATURE_BROWSER_EMULATION'设置为11000以便使用IE11。

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对象的缓存,但是我没有看到任何帮助。

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

IE Group Policy settings for ActiveX

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

Registry Settings for WebBrowser Control

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

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

答案 1 :(得分:0)

我更喜欢在每次启动控件时加载来自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;
    }
}
相关问题