防止WebBrowser控件在winforms加载时发出蜂鸣声
本文关键字:蜂鸣声 加载 winforms WebBrowser 控件 防止 | 更新日期: 2023-09-27 18:10:41
我在窗口窗体应用程序中使用WebBrowser控件。该应用程序定期抓取网站(使用计时器),然后在WebBrowser中显示摘要版本。我加载了一个字符串的WebBrowser使用它的DocumentText属性。
所有的工作都很好,除了当我加载WebBrowser它蜂鸣声,不是第一次,但在随后的加载。我不知道为什么它会发出哔哔声,也许有什么东西不太符合html。但它看起来不错,我希望它不要蜂鸣声,即使浏览器发现一个错误。
如何设置浏览器不提示?
尝试创建自己的WebBrowser控件,如下所示。SafeWebBrowser是一个webbrowser派生控件,不允许脚本或activeX控件执行。它还可以阻止WebBrowser的上下文菜单显示。不确定这是否会停止蜂鸣声,但试一试。
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Windows.Forms;
/// <summary>
/// Stole code from http://stackoverflow.com/questions/7608550/implement-idispatchinvoke-to-be-called-by-a-webbrowser-control
/// </summary>
public class SafeWebBrowser : WebBrowser
{
private const int DISPID_AMBIENT_DLCONTROL = -5512;
private int _downloadControlFlags;
protected override void OnHandleCreated( EventArgs e )
{
base.OnHandleCreated( e );
// Here is where the magic happens.
// Disable java, scripts, activeX controls, etc.
//
DownloadControlFlags = ( int )(
WebBrowserDownloadControlFlags.NO_JAVA
| WebBrowserDownloadControlFlags.NO_BEHAVIORS
| WebBrowserDownloadControlFlags.NO_DLACTIVEXCTLS
| WebBrowserDownloadControlFlags.NO_RUNACTIVEXCTLS
| WebBrowserDownloadControlFlags.NO_SCRIPTS
| WebBrowserDownloadControlFlags.PRAGMA_NO_CACHE
| WebBrowserDownloadControlFlags.SILENT
| WebBrowserDownloadControlFlags.DLIMAGES
);
// Disable the context menu.
//
this.IsWebBrowserContextMenuEnabled = false;
}
// we want our site class, not the default one
protected override WebBrowserSiteBase CreateWebBrowserSiteBase()
{
return new MyWebBrowserSite( this );
}
[DispId( DISPID_AMBIENT_DLCONTROL )]
private int DownloadControlFlags
{
get
{
return _downloadControlFlags;
}
set
{
if ( _downloadControlFlags == value )
return;
_downloadControlFlags = value;
IOleControl ctl = ( IOleControl )ActiveXInstance;
ctl.OnAmbientPropertyChange( DISPID_AMBIENT_DLCONTROL );
}
}
private class MyWebBrowserSite : WebBrowserSite, IReflect
{
private Dictionary<int, PropertyInfo> _dispidCache;
private SafeWebBrowser _host;
public MyWebBrowserSite( SafeWebBrowser host )
: base( host )
{
_host = host;
}
object IReflect.InvokeMember( string name, BindingFlags invokeAttr, Binder binder, object target, object[] args, ParameterModifier[] modifiers, CultureInfo culture, string[] namedParameters )
{
object ret = null;
// Check direct IDispatch call using a dispid (see http://msdn.microsoft.com/en-us/library/de3dhzwy.aspx)
const string dispidToken = "[DISPID=";
if ( name.StartsWith( dispidToken ) )
{
int dispid = int.Parse( name.Substring( dispidToken.Length, name.Length - dispidToken.Length - 1 ) );
if ( _dispidCache == null )
{
// WebBrowser has many properties, so we build a dispid cache on it
_dispidCache = new Dictionary<int, PropertyInfo>();
foreach ( PropertyInfo pi in _host.GetType().GetProperties( BindingFlags.Public | BindingFlags.Instance ) )
{
if ( ( !pi.CanRead ) || ( pi.GetIndexParameters().Length > 0 ) )
continue;
object[] atts = pi.GetCustomAttributes( typeof( DispIdAttribute ), true );
if ( ( atts != null ) && ( atts.Length > 0 ) )
{
DispIdAttribute da = ( DispIdAttribute )atts[ 0 ];
_dispidCache[ da.Value ] = pi;
}
}
}
PropertyInfo property;
if ( _dispidCache.TryGetValue( dispid, out property ) )
{
ret = property.GetValue( _host, null );
}
}
return ret;
}
FieldInfo[] IReflect.GetFields( BindingFlags bindingAttr )
{
return GetType().GetFields( bindingAttr );
}
MethodInfo[] IReflect.GetMethods( BindingFlags bindingAttr )
{
return GetType().GetMethods( bindingAttr );
}
PropertyInfo[] IReflect.GetProperties( BindingFlags bindingAttr )
{
return GetType().GetProperties( bindingAttr );
}
FieldInfo IReflect.GetField( string name, BindingFlags bindingAttr )
{
throw new NotImplementedException();
}
MemberInfo[] IReflect.GetMember( string name, BindingFlags bindingAttr )
{
throw new NotImplementedException();
}
MemberInfo[] IReflect.GetMembers( BindingFlags bindingAttr )
{
throw new NotImplementedException();
}
MethodInfo IReflect.GetMethod( string name, BindingFlags bindingAttr )
{
throw new NotImplementedException();
}
MethodInfo IReflect.GetMethod( string name, BindingFlags bindingAttr, Binder binder, Type[] types, ParameterModifier[] modifiers )
{
throw new NotImplementedException();
}
PropertyInfo IReflect.GetProperty( string name, BindingFlags bindingAttr, Binder binder, Type returnType, Type[] types, ParameterModifier[] modifiers )
{
throw new NotImplementedException();
}
PropertyInfo IReflect.GetProperty( string name, BindingFlags bindingAttr )
{
throw new NotImplementedException();
}
Type IReflect.UnderlyingSystemType
{
get { throw new NotImplementedException(); }
}
}
[ComImport, InterfaceType( ComInterfaceType.InterfaceIsIUnknown ), Guid( "B196B288-BAB4-101A-B69C-00AA00341D07" )]
private interface IOleControl
{
void Reserved0();
void Reserved1();
void OnAmbientPropertyChange( int dispID );
void Reserved2();
}
[Flags]
enum WebBrowserDownloadControlFlags : uint
{
DLIMAGES = 0x00000010,
VIDEOS = 0x00000020,
BGSOUNDS = 0x00000040,
NO_SCRIPTS = 0x00000080,
NO_JAVA = 0x00000100,
NO_RUNACTIVEXCTLS = 0x00000200,
NO_DLACTIVEXCTLS = 0x00000400,
DOWNLOADONLY = 0x00000800,
NO_FRAMEDOWNLOAD = 0x00001000,
RESYNCHRONIZE = 0x00002000,
PRAGMA_NO_CACHE = 0x00004000,
NO_BEHAVIORS = 0x00008000,
NO_METACHARSET = 0x00010000,
URL_ENCODING_DISABLE_UTF8 = 0x00020000,
URL_ENCODING_ENABLE_UTF8 = 0x00040000,
NOFRAMES = 0x00080000,
FORCEOFFLINE = 0x10000000,
NO_CLIENTPULL = 0x20000000,
SILENT = 0x40000000,
OFFLINEIFNOTCONNECTED = 0x80000000,
OFFLINE = OFFLINEIFNOTCONNECTED,
}
}