C# 我是否可以覆盖WebBrowser中的警报/提示对话框行为?
是否有类似于Qt的东西,我可以覆盖每次显示提示/警报时调用的?有人告诉我要实现C# 我是否可以覆盖WebBrowser中的警报/提示对话框行为?,c#,dialog,webbrowser-control,C#,Dialog,Webbrowser Control,是否有类似于Qt的东西,我可以覆盖每次显示提示/警报时调用的?有人告诉我要实现IDocHostShowUI,但即使在做了一些搜索之后,我也不知道如何使用它。保罗·莫尔加多(Paulo Morgado)在网站上给出了答案 下面为将来的读者提供了该帖子的代码和评论 需要实现的是WebBrowserSite,而不是WebBrowser 伊多霍斯特肖维 使用系统; 使用System.Runtime.InteropServices; 命名空间WebBrowserMessageBox { [StructLa
IDocHostShowUI
,但即使在做了一些搜索之后,我也不知道如何使用它。保罗·莫尔加多(Paulo Morgado)在网站上给出了答案
下面为将来的读者提供了该帖子的代码和评论
需要实现的是WebBrowserSite,而不是WebBrowser
伊多霍斯特肖维
使用系统;
使用System.Runtime.InteropServices;
命名空间WebBrowserMessageBox
{
[StructLayout(LayoutKind.Sequential)]
公共结构点
{
公共int x;
公共智力;
}
[ComImport,Guid(“C4D244B0-D43E-11CF-893B-00AA00BDCE1A”),接口类型(ComInterfaceType.InterfaceSiunknown)]
公共接口IDocHostShowUI
{
[返回:Marshallas(UnmanagedType.U4)]
[信号]
int ShowMessage(IntPtr hwnd,
[Marshallas(UnmanagedType.LPWStr)]字符串lpstrText,
[Marshallas(UnmanagedType.LPWStr)]字符串LPSTR选项,
int dwType,
[Marshallas(UnmanagedType.LPWStr)]字符串lpstrHelpFile,
int dwHelpContext,
输出结果);
[返回:Marshallas(UnmanagedType.U4)]
[信号]
int ShowHelp(
IntPtr hwnd,
[Marshallas(UnmanagedType.LPWStr)]字符串pszHelpFile,
int uCommand,
int dwData,
点鼠标,
[Marshallas(UnmanagedType.IDispatch)]对象pDispatchObjectHit);
}
公共类ShowMessageEventArgs:EventArgs
{
public ShowMessageEventArgs(字符串文本、字符串标题、int类型、字符串帮助文件、int帮助上下文)
{
}
公共布尔处理{get;set;}
公共int结果{get;set;}
公共int类型{get;private set;}
public int HelpContext{get;private set;}
公共字符串文本{get;private set;}
公共字符串标题{get;private set;}
公共字符串帮助文件{get;private set;}
}
公共类MyWebBrowser:global::System.Windows.Forms.WebBrowser
{
受保护类MyWebBrowserSite:global::System.Windows.Forms.WebBrowser.WebBrowserSite,IDocHostShowUI
{
私有只读MyWebBrowser主机;
公共MyWebBrowser站点(MyWebBrowser主机)
:基本(主机)
{
this.host=host;
}
公共int ShowMessage(IntPtr hwnd、字符串lpstrText、字符串lpstrcoption、int dwType、字符串lpstrHelpFile、int dwHelpContext、out int lpResult)
{
var e=新的ShowMessageEventArgs(lpstrText、LPSTRCOPTION、dwType、lpstrHelpFile、dwHelpContext);
this.host.OnShowMessage(e);
如果(如已处理)
{
lpResult=e.结果;
返回0;
}
其他的
{
lpResult=0;
返回1;
}
}
public int ShowHelp(IntPtr hwnd、字符串pszHelpFile、int uCommand、int dwData、POINT ptMouse、object pDispatchObjectHit)
{
返回1;
}
}
受保护的覆盖System.Windows.Forms.WebBrowserSiteBase CreateWebBrowserSiteBase()
{
返回新的MyWebBrowserSite(此);
}
受保护的虚拟void OnShowMessage(ShowMessageEventArgs e)
{
var handler=this.Events[“ShowMessage”]作为EventHandler;
if(处理程序!=null)
{
处理者(本,e);
}
}
公共事件事件处理程序ShowMessage
{
添加{this.Events.AddHandler(“ShowMessage”,value);}
删除{this.Events.RemoveHandler(“ShowMessage”,value);}
}
}
公共静态类程序
{
[状态线程]
私有静态void Main(参数字符串[]args)
{
var webBrowser=新的MyWebBrowser
{
Dock=System.Windows.Forms.DockStyle.Fill,
DocumentText=@“警报”(“测试”)“
};
webBrowser.ShowMessage+=(发件人,e)=>
{
e、 结果=0;
e、 已处理=正确;
};
var form=new global::System.Windows.Forms.form
{
控件={webBrowser}
};
全局::System.Windows.Forms.Application.Run(表单);
}
}
}
请注意,我不是这段代码的作者。保罗·莫尔加多的回答有帮助吗@泰克:是的,的确如此!作为答案张贴,以便我可以接受
using System;
using System.Runtime.InteropServices;
namespace WebBrowserMessageBox
{
[StructLayout(LayoutKind.Sequential)]
public struct POINT
{
public int x;
public int y;
}
[ComImport, Guid("C4D244B0-D43E-11CF-893B-00AA00BDCE1A"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IDocHostShowUI
{
[return: MarshalAs(UnmanagedType.U4)]
[PreserveSig]
int ShowMessage(IntPtr hwnd,
[MarshalAs(UnmanagedType.LPWStr)] string lpstrText,
[MarshalAs(UnmanagedType.LPWStr)] string lpstrCaption,
int dwType,
[MarshalAs(UnmanagedType.LPWStr)] string lpstrHelpFile,
int dwHelpContext,
out int lpResult);
[return: MarshalAs(UnmanagedType.U4)]
[PreserveSig]
int ShowHelp(
IntPtr hwnd,
[MarshalAs(UnmanagedType.LPWStr)] string pszHelpFile,
int uCommand,
int dwData,
POINT ptMouse,
[MarshalAs(UnmanagedType.IDispatch)] object pDispatchObjectHit);
}
public class ShowMessageEventArgs : EventArgs
{
public ShowMessageEventArgs(string text, string caption, int type, string helpFile, int helpContext)
{
}
public bool Handled { get; set; }
public int Result { get; set; }
public int Type { get; private set; }
public int HelpContext { get; private set; }
public string Text { get; private set; }
public string Caption { get; private set; }
public string HelpFile { get; private set; }
}
public class MyWebBrowser : global::System.Windows.Forms.WebBrowser
{
protected class MyWebBrowserSite : global::System.Windows.Forms.WebBrowser.WebBrowserSite, IDocHostShowUI
{
private readonly MyWebBrowser host;
public MyWebBrowserSite(MyWebBrowser host)
: base(host)
{
this.host = host;
}
public int ShowMessage(IntPtr hwnd, string lpstrText, string lpstrCaption, int dwType, string lpstrHelpFile, int dwHelpContext, out int lpResult)
{
var e = new ShowMessageEventArgs(lpstrText, lpstrCaption, dwType, lpstrHelpFile, dwHelpContext);
this.host.OnShowMessage(e);
if (e.Handled)
{
lpResult = e.Result;
return 0;
}
else
{
lpResult = 0;
return 1;
}
}
public int ShowHelp(IntPtr hwnd, string pszHelpFile, int uCommand, int dwData, POINT ptMouse, object pDispatchObjectHit)
{
return 1;
}
}
protected override System.Windows.Forms.WebBrowserSiteBase CreateWebBrowserSiteBase()
{
return new MyWebBrowserSite(this);
}
protected virtual void OnShowMessage(ShowMessageEventArgs e)
{
var handler = this.Events["ShowMessage"] as EventHandler<ShowMessageEventArgs>;
if (handler != null)
{
handler(this, e);
}
}
public event EventHandler<ShowMessageEventArgs> ShowMessage
{
add { this.Events.AddHandler("ShowMessage", value); }
remove { this.Events.RemoveHandler("ShowMessage", value); }
}
}
public static class Program
{
[STAThread]
private static void Main(params string[] args)
{
var webBrowser = new MyWebBrowser
{
Dock = System.Windows.Forms.DockStyle.Fill,
DocumentText = @"<html><head><body><script language='JScript'>alert(""test"")</script></body></head></html>"
};
webBrowser.ShowMessage += (sender, e) =>
{
e.Result = 0;
e.Handled = true;
};
var form = new global::System.Windows.Forms.Form
{
Controls = { webBrowser }
};
global::System.Windows.Forms.Application.Run(form);
}
}
}