C# 我是否可以覆盖WebBrowser中的警报/提示对话框行为?

C# 我是否可以覆盖WebBrowser中的警报/提示对话框行为?,c#,dialog,webbrowser-control,C#,Dialog,Webbrowser Control,是否有类似于Qt的东西,我可以覆盖每次显示提示/警报时调用的?有人告诉我要实现IDocHostShowUI,但即使在做了一些搜索之后,我也不知道如何使用它。保罗·莫尔加多(Paulo Morgado)在网站上给出了答案 下面为将来的读者提供了该帖子的代码和评论 需要实现的是WebBrowserSite,而不是WebBrowser 伊多霍斯特肖维 使用系统; 使用System.Runtime.InteropServices; 命名空间WebBrowserMessageBox { [StructLa

是否有类似于Qt的东西,我可以覆盖每次显示提示/警报时调用的?有人告诉我要实现
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);
    }
  }
}