C# 如何禁用wpf webbrowser控件上的拖放

C# 如何禁用wpf webbrowser控件上的拖放,c#,wpf,security,xaml,browser,C#,Wpf,Security,Xaml,Browser,如何禁用在System.Windows.Controls.WebBrowser上放置文件?从文档中可以看出,默认情况下应该禁用此行为,因为它是从UIElement.AllowDrop属性继承的 但是,默认情况下,我可以将文件拖放到WebBrowser控件上。除此之外,我似乎无法禁用这种假定的非默认行为。例如,如果我在XAML中将属性的值显式设置为false <WebBrowser Name="webBrowser1" AllowDrop="False" /> 然后我仍然可以将文件拖

如何禁用在System.Windows.Controls.WebBrowser上放置文件?从文档中可以看出,默认情况下应该禁用此行为,因为它是从UIElement.AllowDrop属性继承的

但是,默认情况下,我可以将文件拖放到WebBrowser控件上。除此之外,我似乎无法禁用这种假定的非默认行为。例如,如果我在XAML中将属性的值显式设置为false

<WebBrowser Name="webBrowser1" AllowDrop="False" />

然后我仍然可以将文件拖放到控件上。如何禁用此行为并消除它所造成的安全风险?

我尝试了几种方法,但看起来WebBrowser控件比布局引擎想要的任何东西都更重要。它不服从,甚至不真正坐在视觉树上,除了控制位置。Panel.ZIndex没有效果,等等

可能需要一个不同的HTML布局控件,一个比ActiveX IE 6/7/8界面性能更好的控件:


我尝试了一些方法,但看起来WebBrowser控件比布局引擎想要的任何东西都更重要。它不服从,甚至不真正坐在视觉树上,除了控制位置。Panel.ZIndex没有效果,等等

可能需要一个不同的HTML布局控件,一个比ActiveX IE 6/7/8界面性能更好的控件:


好的,在玩了好几个小时之后,我想出了一个有效的解决方案。因为我使用的是标准WPF webbrowser,所以我知道我也可以使用Microsoft为Internet Explorer引入的“扩展事件属性”

我用来禁止将文件拖放到控件上的事件是ondragover。本质上,我只是取消事件,每当它发生像这样

<body ondragover="window.event.returnValue=false;">

这并不是很理想,但这种技术的优点在于它允许设置托管代码无法直接使用的所有其他属性。对于未在托管代码中公开的滚动条状态,可以这样设置

<body scroll="no">

好的,在玩了好几个小时之后,我想出了一个有效的解决方案。因为我使用的是标准WPF webbrowser,所以我知道我也可以使用Microsoft为Internet Explorer引入的“扩展事件属性”

我用来禁止将文件拖放到控件上的事件是ondragover。本质上,我只是取消事件,每当它发生像这样

<body ondragover="window.event.returnValue=false;">

这并不是很理想,但这种技术的优点在于它允许设置托管代码无法直接使用的所有其他属性。对于未在托管代码中公开的滚动条状态,可以这样设置

<body scroll="no">

通过反射,有一种有点棘手的方法:

1.)通过调用非公共实例属性“AxIWebBrowser2”上的getter获取底层浏览器COM实例(SHDocVw.IWebBrowser2)

2.)也可以通过调用属性设置程序,将浏览器COM对象上的属性“RegisterAddressTarget”设置为false

就这些

var webBrowser = this.WebBrowser.GetType().InvokeMember("AxIWebBrowser2",
                                                        BindingFlags.Instance |
                                                        BindingFlags.NonPublic |
                                                        BindingFlags.GetProperty,
                                                        null,
                                                        this.WebBrowser,
                                                        new Object[] { });

webBrowser.GetType().InvokeMember("RegisterAsDropTarget",
                                  BindingFlags.Instance |
                                  BindingFlags.SetProperty,
                                  null,
                                  webBrowser,
                                  new Object[] { false });

提示:“this.WebBrowser”是您的WPF WebBrowser实例(System.Windows.Controls.WebBrowser)。

通过反射实现这一点有点棘手:

1.)通过调用非公共实例属性“AxIWebBrowser2”上的getter获取底层浏览器COM实例(SHDocVw.IWebBrowser2)

2.)也可以通过调用属性设置程序,将浏览器COM对象上的属性“RegisterAddressTarget”设置为false

就这些

var webBrowser = this.WebBrowser.GetType().InvokeMember("AxIWebBrowser2",
                                                        BindingFlags.Instance |
                                                        BindingFlags.NonPublic |
                                                        BindingFlags.GetProperty,
                                                        null,
                                                        this.WebBrowser,
                                                        new Object[] { });

webBrowser.GetType().InvokeMember("RegisterAsDropTarget",
                                  BindingFlags.Instance |
                                  BindingFlags.SetProperty,
                                  null,
                                  webBrowser,
                                  new Object[] { false });

提示:“this.WebBrowser”是您的WPF WebBrowser实例(System.Windows.Controls.WebBrowser)。

在加载的文档中执行托管代码和COM组件之间的互操作时,我需要将该控件设置为IE。COM组件只在IE中工作。wpf webbrowser中有这样一个安全漏洞的事实是疯狂的!当我在托管代码和加载文档中的COM组件之间进行互操作时,我需要将控件设置为IE。COM组件只在IE中工作。wpf webbrowser中有这样一个安全漏洞的事实是疯狂的!呃,你把身体标签放在哪里?@Steffen Winkler-在加载到webbrowser控件的html中。啊,很抱歉没有看到web浏览器标签。呃,你把身体标签放在哪里?@Steffen Winkler-在加载到webbrowser控件的html中。啊,抱歉,没有看到web浏览器标记。由于AxIWebBrowser2属性是IWebBrowser2,它是一个IDispatch接口,您可以通过声明“dynamic webBrowser”而不是“var webBrowser”,然后只访问第二个属性:“webBrowser.RegisterAddressDropTarget=false;”@cppguy您是对的,但是通过从反射开始,所以沿着这条路走到底。也可以访问底层WebBrowser控件的其他几个元素。但是,如果大量使用-不要忘记通过
封送.ReleaseComObject()
释放COM调用包装器(键入
\u ComObject
),则会提示COM对象。为此,您必须了解您是该对象的用户或所有者,还是移交所有权
webBrowser
是要使用的COM对象,由webBrowser控件创建。对于从
Document
属性返回的对象,您将是其所有者并必须销毁它。由于WebBrowser控件继承自
System.Windows.Interop.ActiveXHost
,该控件对于相关COM对象实例具有非公共属性
ActiveXInstance
,因此第一步可以简化或通用代码AxIWebBrowser2属性是一个IWebBrowser2,它是一个IDispatch接口,您可以通过声明“dynamic webBrowser”而不是“var webBrowser”来简化它,然后只访问第二个属性:“webBrowser.RegisterAsDropTarget=false;”@cppgay您是对的,但是从
反射开始,所以