• 用Visual C#打造多页面网页浏览器_2


      4) 应该在程序命名空间声明之前,包含下面的接口声明以添加对Microsoft HTML (MSHTML) IOleCommandTarget接口的参照引用:

    using System;
    using System.Runtime.InteropServices;

    [StructLayout(LayoutKind.Sequential,CharSet=CharSet.Unicode)]

    public struct OLECMDTEXT
    {
     public uint cmdtextf;
     public uint cwActual;
     public uint cwBuf;
     [MarshalAs(UnmanagedType.ByValTStr,SizeConst=100)]public char rgwz;
    }

    [StructLayout(LayoutKind.Sequential)]

    public struct OLECMD
    {
     public uint cmdID;
     public uint cmdf;
    }

    // IOleCommandTarget的Interop定义

    [ComImport,

    Guid("b722bccb-4e68-101b-a2bc-00aa00404770"),

    InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]

    public interface IOleCommandTarget
    {
     //重要: 下面方法的顺序非常重要,因为本示例中我们使用的是早期绑定,详见MSDN中有关.net/COM互操作的参考。
     void QueryStatus(ref Guid pguidCmdGroup, UInt32 cCmds,
     [MarshalAs(UnmanagedType.LPArray, SizeParamIndex=1)] OLECMD[] prgCmds, ref OLECMDTEXT CmdText);
     void Exec(ref Guid pguidCmdGroup, uint nCmdId, uint nCmdExecOpt, ref object pvaIn, ref object pvaOut);
    }

      2、为CGID_IWebBrowser定义一个GUID

      必须定义CGI_IWebBrowser的GUID以通知MSHTML如何来处理你的命令ID。在.NET中实现如下:

    private Guid cmdGuid = new Guid("ED016940-BD5B-11CF-BA4E-00C04FD70816");
    private enum MiscCommandTarget { Find = 1, ViewSource, Options }

      3、调用Exec()方法

      注意,下列三个过程成功调用Exec()的前提是,已经存在名为webBrowser的浏览器控件的被包容实例。

    private mshtml.HTMLDocument GetDocument()
    {
     try
     {
      mshtml.HTMLDocument htm = (mshtml.HTMLDocument)axWebBrowser2.Document;
      return htm;
     }
     catch
     {
      throw (new Exception("不能从WebBrowser控件中获取文件对象"));
     }
    }

    //查看源码的方法

    public void ViewSource()
    {
     IOleCommandTarget cmdt;
     Object o = new object();
     try
     {
      cmdt = (IOleCommandTarget)GetDocument();
      cmdt.Exec(ref cmdGuid, (uint)MiscCommandTarget.ViewSource,
    (uint)SHDocVw.OLECMDEXECOPT.OLECMDEXECOPT_DODEFAULT, ref o, ref o);
     }
     catch(Exception e)
     {
      System.Windows.Forms.MessageBox.Show(e.Message);
     }
    }

    public void Find()
    {
     IOleCommandTarget cmdt;
     Object o = new object();
     try
     {
      cmdt = (IOleCommandTarget)GetDocument();
      cmdt.Exec(ref cmdGuid, (uint)MiscCommandTarget.Find,
    (uint)SHDocVw.OLECMDEXECOPT.OLECMDEXECOPT_DODEFAULT, ref o, ref o);
     }
     catch(Exception e)
     {
      System.Windows.Forms.MessageBox.Show(e.Message);
     }
    }

    //显示“选项”对话框的方法

    public void InternetOptions()
    {
     IOleCommandTarget cmdt;
     Object o = new object();
     try
     {
      cmdt = (IOleCommandTarget)GetDocument();
      cmdt.Exec(ref cmdGuid, (uint)MiscCommandTarget.Options,
    (uint)SHDocVw.OLECMDEXECOPT.OLECMDEXECOPT_DODEFAULT, ref o, ref o);
     }
     catch
     {
      // 注意:因为该过程相应的CMDID是在Internet Explorer处理
      // ,所以此处的异常代码块将总被激活,即使该对话框及其操作成功。
      //当然,你可以通过浏览器选择设置来禁止这种错误的出现。
      //不过,即使出现这种提示,对你的主机也无任何损害。
     }
    }

      四、总结

      本文通过C#编例,详细介绍如何实现一种多页面浏览程序的基本原理。欢迎同仁批评指正。 另外,本文所附源程序在Windows 2000/.Net 2003/Internet Explorer 6平台上调试通过。
  • 相关阅读:
    高可用测试二
    sync包测试代码
    element 中 input设置了type="number"还能输入e和负数的问题如何解决?
    git添加rsa ssh key后仍提示Permission denied (publickey)解决方法
    nginx 反向代理跨域
    SAP ABAP MDG相关事务码 摘录
    其他23防抖
    Python内置函数:index
    Python内置函数:enumerate
    MySQL查看表占用空间大小
  • 原文地址:https://www.cnblogs.com/King0502/p/2019381.html
Copyright © 2020-2023  润新知