wpf WebBrowser:如何自动允许ActiveX内容

nwlqm0z1  于 2023-05-08  发布在  其他
关注(0)|答案(3)|浏览(254)

我在打开本地计算机上使用ActiveX控件的一组html文件时遇到了问题。
不断的通知弹出是令人沮丧的,因为它出现的每一页。
我不能更改文件,因为它是由外部应用程序生成的,我不想启用IE的ActiveX控件一般。
我想做的是允许我的网页浏览器控件,嵌入在一个WPF窗口,以允许阻止的内容自动如果它是从本地计算机(或至少任何阻止的内容,因为我可以控制什么我的网页浏览器控件可以和不能打开)
我看不出有什么明显的方法来做到这一点,没有选项来允许被阻止的内容,也没有事件来识别被阻止的内容何时被发现。
有没有办法做到这一点?
谢谢
编辑-对这个问题有很多观点,但没有一个评论。我会欢迎任何建议,甚至是一个替代控件,我意识到默认的WebBrowser并不理想。是否有其他浏览器提供此功能?
为了给这个问题增加一点细节,我想我应该再解释一下需求:
所显示的资源是一组html文件,这些文件由无法更改的旧版工具生成为报告。我构建的工具将允许用户定义报告的目的地,然后允许他们使用嵌入式浏览器浏览它。我真的只需要一个控件,将呈现HTML和ActiveX控件作为浏览器,但没有任何干扰,从互联网安全设置。
更新-不幸的是,我不再从事这个项目,但我感兴趣的问题/修复,所以我shal尝试和复制它在我的业余时间。
我也重新命名了这个问题,因为我意识到我正在处理的问题是ActiveX内容,它可能有一个解决方案(见Rajesh的回答),这是特定于这种类型的内容。

8yoxcaq7

8yoxcaq71#

您需要将文件位置添加到受信任的站点。这是可能的,无论是在本地计算机上运行的Web服务器,还是它们所在的文件夹是共享文件夹。
在IE中,转到Internet选项>安全性,选择“受信任的站点”,然后单击“站点”按钮。输入位置(即文件:\server-Hostname\Sharedfolder*(对于共享文件夹),然后单击“添加”(确保未选中“需要服务器验证(https:)...”选项)。
如果你在网上搜索“将本地文件添加到受信任的站点”,会有更多的信息可用。我似乎记得添加一个本地文件位置,而不必共享文件夹,但目前我不记得我是如何做到的。

2ic8powd

2ic8powd2#

当尝试使用WebBrowser(MSHTML)对象(在本例中为C#程序)从使用ActiveX控件的本地计算机打开HTML文件时,一条或多条安全消息将中断程序执行。
1.打开页面时将显示以下消息:

1.如果第一条消息已被禁止,则当页面的JScript或VBScript代码尝试使用ActiveX控件时,我们仍将收到以下消息:

要禁止显示第一条消息,请将以下Mark of the Web行添加到本地HTML页面的顶部:
<!-- saved from url=(0016)https://localhost -->
要抑制第二条消息并允许控件实际运行,我们需要暂时允许ActiveX控件加载到本地安全区域(区域1)中。最容易的方法是在HKCU中设置一个注册表值,以允许控件加载页面,然后恢复原始注册表值。
对于这如何为IE(使用相同的设置)打开一个安全漏洞,几乎没有(如果有的话)真实的的担忧,因为它只针对本地区域。此外,截至2023年,IE将被禁用为通用浏览器。
在下面的C#代码示例中,原始值立即恢复,在本示例中没有问题。在某些情况下,您可能需要检查DocumentCompleted事件。

注意:WebBrowser控件不使用IE。它使用MSHTML,这是IE使用的相同引擎。如果IE被卸载,WebBowser对象将继续正常工作。如果您的程序通过COM明确使用IE,那么,在这种情况下,它将需要IE,但与流行的看法相反,IE仍然安装在Windows 10和11中,并且仅作为通用浏览器禁用。
其他解决方案

使用HTA扩展名重命名本地HTML文件会在没有提示的情况下运行页面,但随后它们会通过MSHTA.exe运行,从而使WebBrowser对象变得毫无意义。
使用本地主机IP地址打开本地文件将抑制某些提示,但初始安全警告仍将保留,并且仍需要允许Active X对象。示例:
file://127.0.0.1/c$/Test/ActiveXTest.htm

MainWindow.xaml.cs

{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            string keyName = @"HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\1";
            string valueName = "1201";
            int AllowActiveX = 3;
            object value = Registry.GetValue(keyName, valueName, null);
            if (value != null) { AllowActiveX = (int)value; }

            Registry.SetValue(keyName, valueName, 0, RegistryValueKind.DWord);

            wbSample.Navigate("C:\\Test\\ActiveXTest.htm");

            Registry.SetValue(keyName, valueName, AllowActiveX, RegistryValueKind.DWord);
        }
    }
}

主窗口.xaml

<Window x:Class="WebBrowserControlTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
        <WebBrowser Name="wbSample"></WebBrowser>
</Window>

ActiveXTest.htm

<!-- saved from url=(0016)https://localhost -->
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="X-UA-Compatible" content="IE=11">
</head>
<body>
<h1 id=bn></h1>
<script language="JScript">
  var oWSH = new ActiveXObject("Wscript.Shell");
  bn.innerText = oWSH.RegRead("HKLM\\Software\\Microsoft\\Windows NT\\CurrentVersion\\CurrentBuild");
</script>
</body>
</html>
bnlyeluc

bnlyeluc3#

只需将这一行添加到您的html页面的开始处的html标记之前。
<保存自url=(0023)http://www.contoso.com/
然后选择并注解它。

相关问题