使用WPF WebBrowser控件时的问题仿真> IE7

时间:2015-05-18 23:00:51

标签: c# wpf webbrowser-control

我有一个C#/ WPF应用程序,该应用程序使用WebBrowser控件,该控件将网站作为其主要界面(用于自助服务终端)。该网站可以通过javascript调用C#方法进行一些本地处理。一切正常,直到我设置了'FEATURE_BROWSER_EMULATION' IE7以上(使用下面的代码)。当我执行javascript调用本机方法时,除非我从' http://localhost'运行网站,否则不会调用它。哪个工作正常。

我认为这是一个安全问题。我搞乱了IE中的所有安全设置(包括将网站设置为“受信任的网站”),但我似乎无法使其正常运行。

编码我使用设置仿真:

private void SetBrowserCompatibilityMode()
    {
        // http://msdn.microsoft.com/en-us/library/ee330720(v=vs.85).aspx

        // FeatureControl settings are per-process
        var fileName = System.IO.Path.GetFileName( Process.GetCurrentProcess().MainModule.FileName );

        if ( String.Compare( fileName, "devenv.exe", true ) == 0 ) // make sure we're not running inside Visual Studio
            return;

        using ( var key = Registry.CurrentUser.CreateSubKey( @"Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION",
            RegistryKeyPermissionCheck.ReadWriteSubTree ) )
        {
            // Webpages containing standards-based !DOCTYPE directives are displayed in IE10 Standards mode.
            UInt32 mode = 11000; // 11000 = IE11, 10000 = IE10, 9000 = IE9, 8000 = IE8, 7000 = IE7; 
            key.SetValue( fileName, mode, RegistryValueKind.DWord );
        }

        using ( var key = Registry.CurrentUser.CreateSubKey( @"Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_ZONE_ELEVATION",
            RegistryKeyPermissionCheck.ReadWriteSubTree ) )
        {
            // disable zone elevation prevention
            UInt32 mode = 0;
            key.SetValue( fileName, mode, RegistryValueKind.DWord );
        }

        using ( var key = Registry.CurrentUser.CreateSubKey( @"Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BLOCK_LMZ_SCRIPT",
            RegistryKeyPermissionCheck.ReadWriteSubTree ) )
        {
            // enable <scripts> in local machine zone
            UInt32 mode = 0;
            key.SetValue( fileName, mode, RegistryValueKind.DWord );
        }

        using ( var key = Registry.CurrentUser.CreateSubKey( @"Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_NINPUT_LEGACYMODE",
            RegistryKeyPermissionCheck.ReadWriteSubTree ) )
        {
            // disable Legacy Input Model
            UInt32 mode = 0;
            key.SetValue( fileName, mode, RegistryValueKind.DWord );
        }

    }

2 个答案:

答案 0 :(得分:1)

禁用FEATURE_LOCALMACHINE_LOCKDOWNFEATURE_BLOCK_LMZ_SCRIPTFEATURE_BLOCK_LMZ_OBJECT功能。您可以从here调整工作的C#代码。或者,我相信您可以使用"Mark of Web"重新运行脚本。

答案 1 :(得分:0)

尝试以下方法之一: 1-以管理员身份运行程序。 2-检查您的JavaScript是否与您正在模拟的版本兼容,因为某些JavaScript代码在IE7上运行但不在上面。

更新: 这是我设置仿真的方法,请注意,如果您不以管理员身份运行此代码,则此代码将无效:

def execute(connection: Connection, procedure: GPProcedure, ps: GPProcedureParameterSet) = {
    val cs = connection.prepareCall(procedure.toString)
    var index = 0

    for (parameter <- ps.parameters) {
        index = index + 1
        parameter match {
            // Handle any IN (or INOUT) types: If the optional value is None, set it to NULL, otherwise, map it according to
            // the actual object value and type encoding:
            case p: GPOut => cs.registerOutParameter(index, p.parameterType)
            case GPIn(None, t) => cs.setNull(index, t)
            case GPIn(v: Some[_], Types.NUMERIC | Types.DECIMAL) => cs.setBigDecimal(index, v.get.asInstanceOf[java.math.BigDecimal])
            case GPIn(v: Some[_], Types.BIGINT) => cs.setLong(index, v.get.asInstanceOf[Long])
            case GPIn(v: Some[_], Types.INTEGER) => cs.setInt(index, v.get.asInstanceOf[Int])
            case GPIn(v: Some[_], Types.VARCHAR | Types.LONGVARCHAR) => cs.setString(index, v.get.asInstanceOf[String])
            case GPIn(v: Some[_], Types.CHAR) => cs.setString(index, v.get.asInstanceOf[String].head.toString)
            case GPInOut(None, t) => cs.setNull(index, t)

            // Now handle all of the OUT (or INOUT) parameters, these we just need to set the return value type:
            case GPInOut(v: Some[_], Types.NUMERIC) => {
                cs.setBigDecimal(index, v.get.asInstanceOf[java.math.BigDecimal]); cs.registerOutParameter(index, Types.NUMERIC)
            }
            case GPInOut(v: Some[_], Types.DECIMAL) => {
                cs.setBigDecimal(index, v.get.asInstanceOf[java.math.BigDecimal]); cs.registerOutParameter(index, Types.DECIMAL)
            }
            case GPInOut(v: Some[_], Types.BIGINT) => {
                cs.setLong(index, v.get.asInstanceOf[Long]); cs.registerOutParameter(index, Types.BIGINT)
            }
            case GPInOut(v: Some[_], Types.INTEGER) => {
                cs.setInt(index, v.get.asInstanceOf[Int]); cs.registerOutParameter(index, Types.INTEGER)
            }
            case GPInOut(v: Some[_], Types.VARCHAR) => {
                cs.setString(index, v.get.asInstanceOf[String]); cs.registerOutParameter(index, Types.VARCHAR)
            }
            case GPInOut(v: Some[_], Types.LONGVARCHAR) => {
                cs.setString(index, v.get.asInstanceOf[String]); cs.registerOutParameter(index, Types.LONGVARCHAR)
            }
            case GPInOut(v: Some[_], Types.CHAR) => {
                cs.setString(index, v.get.asInstanceOf[String].head.toString); cs.registerOutParameter(index, Types.CHAR)
            }
            case _ => { Logger(s"Failed to match GPProcedureParameter in executeFunction (IN): index $index (${parameter.toString})") }
        }
    }

    cs.execute()

    // Now, step through each of the parameters, and get the corresponding result from the execute statement. If there is
    // no result for the specified column (index), we'll basically end up getting a "nothing" back, which we strip out.

    index = 0

    val results: List[Any] = for (parameter <- ps.parameters) yield {
        index = index + 1
        parameter match {
            case GPOut(Types.NUMERIC) | GPOut(Types.DECIMAL) => cs.getBigDecimal(index)
            case GPOut(Types.BIGINT) => cs.getLong(index)
            case GPOut(Types.INTEGER) => cs.getInt(index)
            case GPOut(Types.VARCHAR | Types.LONGVARCHAR | Types.CHAR) => cs.getString(index)
            case GPInOut(v: Some[_], Types.NUMERIC | Types.DECIMAL) => cs.getInt(index)
            case GPInOut(v: Some[_], Types.BIGINT) => cs.getLong(index)
            case GPInOut(v: Some[_], Types.INTEGER) => cs.getInt(index)
            case GPInOut(v: Some[_], Types.VARCHAR | Types.LONGVARCHAR | Types.CHAR) => cs.getString(index)
            case _ => {
                Logger(s"Failed to match GPProcedureParameter in executeFunction (OUT): index $index (${parameter.toString})")
            }
        }
    }

    cs.close()

    // Return the function return parameters (there should always be one, the caller will get a List with as many return
    // parameters as we receive):

    results.filter(_ != (()))
}

并使用该功能:

    private static void SetIEVersioneKeyforWebBrowserControl(string appName, int ieval)
    {
        RegistryKey Regkey = null;
        try
        {
            Regkey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION", true);

            //If the path is not correct or 
            //If user't have priviledges to access registry 
            if (Regkey == null)
            {
                _logger.Error("Application FEATURE_BROWSER_EMULATION Failed - Registry key Not found");
                return;
            }

            string FindAppkey = Convert.ToString(Regkey.GetValue(appName));

            //Check if key is already present 
            if (FindAppkey == ieval.ToString())
            {
                _logger.Debug("Application FEATURE_BROWSER_EMULATION already set to " + ieval);
                Regkey.Close();
                return;
            }

            //If key is not present or different from desired, add/modify the key , key value 
            Regkey.SetValue(appName, unchecked((int)ieval), RegistryValueKind.DWord);

            //check for the key after adding 
            FindAppkey = Convert.ToString(Regkey.GetValue(appName));

            if (FindAppkey == ieval.ToString())
            {
                _logger.Info("Application FEATURE_BROWSER_EMULATION changed to " + ieval + "; changes will be visible at application restart");
            }
            else
            {
                _logger.Error("Application FEATURE_BROWSER_EMULATION setting failed; current value is  " + ieval);
            }
        }
        catch (Exception ex)
        {
            _logger.Error("Application FEATURE_BROWSER_EMULATION setting failed; " + ex.Message);
        }
        finally
        {
            //Close the Registry 
            if (Regkey != null) Regkey.Close();
        }
    }