三、实现“查找”、“查看页面源文件”、“选项”对话框等功能 注意 本例程中使用了一个未公开的GUID,其在将来的系统中可以发生变更。 1、定义 IOleCommandTarget 接口 为定义一个.NET接口以获得关于一个COM接口的参考,请遵从下列步骤: 1) 赋予.NET接口相应的COM接口的GUID值; 2) 包含对接口中所有方法的类型声明; 3) 包含对Mshtml.dll和Shdocvw.dll文件的参考,在Visual C# .NET工程中操作,请遵从: A. 在项目菜单下单击“添加引用”; B. 单击“COM” 选项卡; C. 双击“Microsoft HTML Object Library” 和“Microsoft Internet Controls”。
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平台上调试通过。