C#中实现WebBrowser控件的HTML源代码读写

时间:2021-02-14 14:59:51

原文:C#中实现WebBrowser控件的HTML源代码读写

C#中实现WebBrowser控件的HTML源代码读写

http://www.blogcn.com/user8/flier_lu/index.html?id=1125200&run=.0D9CAA6

趁周末想折腾一下嵌入ASP.NET的WinForm程序
 需要用到WebBrowser控件的HTML源码读写
 就把以前的一些代码片断移值到C#下
 顺便发个帖子备忘,呵呵
  
 思路其实很简单,直接通过document.documentElement.outerHTML
 或者使用IPersistStreamInit接口直接对流进行处理
 前者我就不废话了,后者实现方法如下
  
 首先是写入HTML到已初始化的WebBrowser控件
 初始化可以通过Navigate("about:blank")完成
 必须确保WebBrowser.Document != null
 否则应该推迟到DocumentComplete事件再读写

C#中实现WebBrowser控件的HTML源代码读写UCOMIStream stream = null;
C#中实现WebBrowser控件的HTML源代码读写  
C#中实现WebBrowser控件的HTML源代码读写 CreateStreamOnHGlobal(Marshal.StringToHGlobalUni(value), true, out stream);
C#中实现WebBrowser控件的HTML源代码读写   
C#中实现WebBrowser控件的HTML源代码读写
C#中实现WebBrowser控件的HTML源代码读写
C#中实现WebBrowser控件的HTML源代码读写
C#中实现WebBrowser控件的HTML源代码读写 if(stream != null)
C#中实现WebBrowser控件的HTML源代码读写  
C#中实现WebBrowser控件的HTML源代码读写C#中实现WebBrowser控件的HTML源代码读写 C#中实现WebBrowser控件的HTML源代码读写{
C#中实现WebBrowser控件的HTML源代码读写   IPersistStreamInit persistentStreamInit =
C#中实现WebBrowser控件的HTML源代码读写     (IPersistStreamInit)WebBrowser.Document;
C#中实现WebBrowser控件的HTML源代码读写  
C#中实现WebBrowser控件的HTML源代码读写   persistentStreamInit.InitNew();
C#中实现WebBrowser控件的HTML源代码读写   persistentStreamInit.Load(stream);
C#中实现WebBrowser控件的HTML源代码读写   persistentStreamInit = null;
C#中实现WebBrowser控件的HTML源代码读写 }
C#中实现WebBrowser控件的HTML源代码读写

UCOMIStream是COM中IStream的CLR版本
 CreateStreamOnHGlobal函数从一个字符串的地址
 创建一个IStream供使用

C#中实现WebBrowser控件的HTML源代码读写 [DllImport("ole32.dll", PreserveSig=false)]
C#中实现WebBrowser控件的HTML源代码读写 static extern void CreateStreamOnHGlobal(IntPtr hGlobal,
C#中实现WebBrowser控件的HTML源代码读写   Boolean fDeleteOnRelease, [Out] out UCOMIStream pStream);

然后就是通过IPersistStreamInit接口初始化并载入HTML源码,
 IPersistStreamInit接口CLR缺省没有导入,定义如下

C#中实现WebBrowser控件的HTML源代码读写 [ComVisible(true), ComImport(), Guid("7FD52380-4E07-101B-AE2D-08002B2EC713"),
C#中实现WebBrowser控件的HTML源代码读写  InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]
C#中实现WebBrowser控件的HTML源代码读写 public interface IPersistStreamInit
C#中实现WebBrowser控件的HTML源代码读写C#中实现WebBrowser控件的HTML源代码读写 C#中实现WebBrowser控件的HTML源代码读写{
C#中实现WebBrowser控件的HTML源代码读写   void GetClassID([In, Out] ref Guid pClassID);
C#中实现WebBrowser控件的HTML源代码读写  
C#中实现WebBrowser控件的HTML源代码读写   [return: MarshalAs(UnmanagedType.I4)] [PreserveSig]
C#中实现WebBrowser控件的HTML源代码读写   int IsDirty();
C#中实现WebBrowser控件的HTML源代码读写  
C#中实现WebBrowser控件的HTML源代码读写   void Load([In, MarshalAs(UnmanagedType.Interface)] UCOMIStream pstm);
C#中实现WebBrowser控件的HTML源代码读写   void Save([In, MarshalAs(UnmanagedType.Interface)] UCOMIStream pstm,
C#中实现WebBrowser控件的HTML源代码读写             [In, MarshalAs(UnmanagedType.I4)] int fClearDirty);
C#中实现WebBrowser控件的HTML源代码读写   void GetSizeMax([Out, MarshalAs(UnmanagedType.LPArray)] long pcbSize);
C#中实现WebBrowser控件的HTML源代码读写   void InitNew();
C#中实现WebBrowser控件的HTML源代码读写 }

读取HTML也是类似思路,将HTML源码写到一个IStream中
 然后转换成字符串供C#代码使用,不过实现方式比较麻烦
  
 比较简单的方法还是使用ole32.dll提供的函数
 重建流,但这需要预先设定流的长度,如

C#中实现WebBrowser控件的HTML源代码读写UCOMIStream stream = null;
C#中实现WebBrowser控件的HTML源代码读写  
C#中实现WebBrowser控件的HTML源代码读写 CreateStreamOnHGlobal(Marshal.AllocHGlobal(4096), true, out stream);
C#中实现WebBrowser控件的HTML源代码读写  
C#中实现WebBrowser控件的HTML源代码读写 IPersistStreamInit persistentStreamInit =
C#中实现WebBrowser控件的HTML源代码读写   (IPersistStreamInit)WebBrowser.Document;
C#中实现WebBrowser控件的HTML源代码读写  
C#中实现WebBrowser控件的HTML源代码读写 persistentStreamInit.Save(stream, 0);
C#中实现WebBrowser控件的HTML源代码读写 persistentStreamInit = null;
C#中实现WebBrowser控件的HTML源代码读写  
C#中实现WebBrowser控件的HTML源代码读写 IntPtr pStr;
C#中实现WebBrowser控件的HTML源代码读写  
C#中实现WebBrowser控件的HTML源代码读写 GetHGlobalFromStream(stream, out pStr);
C#中实现WebBrowser控件的HTML源代码读写  
C#中实现WebBrowser控件的HTML源代码读写 return Marshal.PtrToStringAnsi(pStr);

然后使用GetHGlobalFromStream函数和
 Marshal.PtrToStringAnsi将流转换为字符串
 另外一种方法是自行实现一个支持IStream接口的类
 通过流的方式灵活完成读取操作,我比较喜欢这种

C#中实现WebBrowser控件的HTML源代码读写 using(MemoryStream stream = new MemoryStream())
C#中实现WebBrowser控件的HTML源代码读写
C#中实现WebBrowser控件的HTML源代码读写
C#中实现WebBrowser控件的HTML源代码读写C#中实现WebBrowser控件的HTML源代码读写 C#中实现WebBrowser控件的HTML源代码读写{
C#中实现WebBrowser控件的HTML源代码读写   ComStreamAdapter adapter = new ComStreamAdapter(stream);
C#中实现WebBrowser控件的HTML源代码读写  
C#中实现WebBrowser控件的HTML源代码读写   IPersistStreamInit persistentStreamInit =
C#中实现WebBrowser控件的HTML源代码读写     (IPersistStreamInit)WebBrowser.Document;
C#中实现WebBrowser控件的HTML源代码读写  
C#中实现WebBrowser控件的HTML源代码读写   persistentStreamInit.Save(adapter, 0);
C#中实现WebBrowser控件的HTML源代码读写  
C#中实现WebBrowser控件的HTML源代码读写   stream.Seek(0, SeekOrigin.Begin);
C#中实现WebBrowser控件的HTML源代码读写  
C#中实现WebBrowser控件的HTML源代码读写   using(StreamReader reader = new StreamReader(stream))
C#中实现WebBrowser控件的HTML源代码读写C#中实现WebBrowser控件的HTML源代码读写   C#中实现WebBrowser控件的HTML源代码读写{
C#中实现WebBrowser控件的HTML源代码读写     return reader.ReadToEnd();
C#中实现WebBrowser控件的HTML源代码读写   }
C#中实现WebBrowser控件的HTML源代码读写 }
C#中实现WebBrowser控件的HTML源代码读写

这里的ComStreamAdapter是一个使用了adapter模式的类
 将普通的System.IO.Stream转换为IStream支持的类

C#中实现WebBrowser控件的HTML源代码读写  public class ComStreamAdapter : UCOMIStream
C#中实现WebBrowser控件的HTML源代码读写C#中实现WebBrowser控件的HTML源代码读写     C#中实现WebBrowser控件的HTML源代码读写{
C#中实现WebBrowser控件的HTML源代码读写       private Stream _stream;
C#中实现WebBrowser控件的HTML源代码读写
C#中实现WebBrowser控件的HTML源代码读写
C#中实现WebBrowser控件的HTML源代码读写  
C#中实现WebBrowser控件的HTML源代码读写       public ComStreamAdapter(Stream stream)
C#中实现WebBrowser控件的HTML源代码读写C#中实现WebBrowser控件的HTML源代码读写       C#中实现WebBrowser控件的HTML源代码读写{
C#中实现WebBrowser控件的HTML源代码读写         _stream = stream;
C#中实现WebBrowser控件的HTML源代码读写       }
C#中实现WebBrowser控件的HTML源代码读写  
C#中实现WebBrowser控件的HTML源代码读写C#中实现WebBrowser控件的HTML源代码读写       UCOMIStream Members#region UCOMIStream Members
C#中实现WebBrowser控件的HTML源代码读写  
C#中实现WebBrowser控件的HTML源代码读写       public void Commit(int grfCommitFlags)
C#中实现WebBrowser控件的HTML源代码读写C#中实现WebBrowser控件的HTML源代码读写       C#中实现WebBrowser控件的HTML源代码读写{
C#中实现WebBrowser控件的HTML源代码读写       }
C#中实现WebBrowser控件的HTML源代码读写  
C#中实现WebBrowser控件的HTML源代码读写       public void Clone(out UCOMIStream ppstm)
C#中实现WebBrowser控件的HTML源代码读写C#中实现WebBrowser控件的HTML源代码读写       C#中实现WebBrowser控件的HTML源代码读写{
C#中实现WebBrowser控件的HTML源代码读写         ppstm = null;
C#中实现WebBrowser控件的HTML源代码读写       }
C#中实现WebBrowser控件的HTML源代码读写  
C#中实现WebBrowser控件的HTML源代码读写       public void CopyTo(UCOMIStream pstm, long cb, System.IntPtr pcbRead, Syste
C#中实现WebBrowser控件的HTML源代码读写 m.IntPtr pcbWritten)
C#中实现WebBrowser控件的HTML源代码读写C#中实现WebBrowser控件的HTML源代码读写       C#中实现WebBrowser控件的HTML源代码读写{
C#中实现WebBrowser控件的HTML源代码读写       }
C#中实现WebBrowser控件的HTML源代码读写  
C#中实现WebBrowser控件的HTML源代码读写
C#中实现WebBrowser控件的HTML源代码读写
C#中实现WebBrowser控件的HTML源代码读写       public void Revert()
C#中实现WebBrowser控件的HTML源代码读写C#中实现WebBrowser控件的HTML源代码读写       C#中实现WebBrowser控件的HTML源代码读写{
C#中实现WebBrowser控件的HTML源代码读写       }
C#中实现WebBrowser控件的HTML源代码读写  
C#中实现WebBrowser控件的HTML源代码读写       public void LockRegion(long libOffset, long cb, int dwLockType)
C#中实现WebBrowser控件的HTML源代码读写C#中实现WebBrowser控件的HTML源代码读写       C#中实现WebBrowser控件的HTML源代码读写{
C#中实现WebBrowser控件的HTML源代码读写       }
C#中实现WebBrowser控件的HTML源代码读写  
C#中实现WebBrowser控件的HTML源代码读写       public void UnlockRegion(long libOffset, long cb, int dwLockType)
C#中实现WebBrowser控件的HTML源代码读写C#中实现WebBrowser控件的HTML源代码读写       C#中实现WebBrowser控件的HTML源代码读写{
C#中实现WebBrowser控件的HTML源代码读写       }
C#中实现WebBrowser控件的HTML源代码读写  
C#中实现WebBrowser控件的HTML源代码读写       public void Seek(long dlibMove, int dwOrigin, System.IntPtr plibNewPositio
C#中实现WebBrowser控件的HTML源代码读写 n)
C#中实现WebBrowser控件的HTML源代码读写C#中实现WebBrowser控件的HTML源代码读写       C#中实现WebBrowser控件的HTML源代码读写{
C#中实现WebBrowser控件的HTML源代码读写         _stream.Seek(dlibMove, (SeekOrigin)dwOrigin);
C#中实现WebBrowser控件的HTML源代码读写  
C#中实现WebBrowser控件的HTML源代码读写         if(plibNewPosition != IntPtr.Zero)
C#中实现WebBrowser控件的HTML源代码读写C#中实现WebBrowser控件的HTML源代码读写         C#中实现WebBrowser控件的HTML源代码读写{
C#中实现WebBrowser控件的HTML源代码读写           Marshal.WriteInt32(plibNewPosition, (int)_stream.Position);
C#中实现WebBrowser控件的HTML源代码读写         }
C#中实现WebBrowser控件的HTML源代码读写       }
C#中实现WebBrowser控件的HTML源代码读写
C#中实现WebBrowser控件的HTML源代码读写
C#中实现WebBrowser控件的HTML源代码读写  
C#中实现WebBrowser控件的HTML源代码读写       public void Read(byte[] pv, int cb, System.IntPtr pcbRead)
C#中实现WebBrowser控件的HTML源代码读写C#中实现WebBrowser控件的HTML源代码读写       C#中实现WebBrowser控件的HTML源代码读写{
C#中实现WebBrowser控件的HTML源代码读写         int size = _stream.Read(pv, (int)_stream.Position, cb);
C#中实现WebBrowser控件的HTML源代码读写  
C#中实现WebBrowser控件的HTML源代码读写         if(pcbRead != IntPtr.Zero)
C#中实现WebBrowser控件的HTML源代码读写C#中实现WebBrowser控件的HTML源代码读写         C#中实现WebBrowser控件的HTML源代码读写{
C#中实现WebBrowser控件的HTML源代码读写           Marshal.WriteInt32(pcbRead, size);
C#中实现WebBrowser控件的HTML源代码读写         }
C#中实现WebBrowser控件的HTML源代码读写       }
C#中实现WebBrowser控件的HTML源代码读写  
C#中实现WebBrowser控件的HTML源代码读写       public void Write(byte[] pv, int cb, System.IntPtr pcbWritten)
C#中实现WebBrowser控件的HTML源代码读写C#中实现WebBrowser控件的HTML源代码读写       C#中实现WebBrowser控件的HTML源代码读写{
C#中实现WebBrowser控件的HTML源代码读写         _stream.Write(pv, 0, cb);
C#中实现WebBrowser控件的HTML源代码读写  
C#中实现WebBrowser控件的HTML源代码读写         if(pcbWritten != IntPtr.Zero)
C#中实现WebBrowser控件的HTML源代码读写C#中实现WebBrowser控件的HTML源代码读写         C#中实现WebBrowser控件的HTML源代码读写{
C#中实现WebBrowser控件的HTML源代码读写           Marshal.WriteInt32(pcbWritten, cb);
C#中实现WebBrowser控件的HTML源代码读写         }
C#中实现WebBrowser控件的HTML源代码读写       }
C#中实现WebBrowser控件的HTML源代码读写  
C#中实现WebBrowser控件的HTML源代码读写       public void SetSize(long libNewSize)
C#中实现WebBrowser控件的HTML源代码读写
C#中实现WebBrowser控件的HTML源代码读写
C#中实现WebBrowser控件的HTML源代码读写         _stream.SetLength(libNewSize);
C#中实现WebBrowser控件的HTML源代码读写       }
C#中实现WebBrowser控件的HTML源代码读写  
C#中实现WebBrowser控件的HTML源代码读写       public void Stat(out STATSTG pstatstg, int grfStatFlag)
C#中实现WebBrowser控件的HTML源代码读写C#中实现WebBrowser控件的HTML源代码读写       C#中实现WebBrowser控件的HTML源代码读写{
C#中实现WebBrowser控件的HTML源代码读写         pstatstg = new STATSTG ();
C#中实现WebBrowser控件的HTML源代码读写       }
C#中实现WebBrowser控件的HTML源代码读写  
C#中实现WebBrowser控件的HTML源代码读写       #endregion
C#中实现WebBrowser控件的HTML源代码读写     }
C#中实现WebBrowser控件的HTML源代码读写
C#中实现WebBrowser控件的HTML源代码读写
C#中实现WebBrowser控件的HTML源代码读写
C#中实现WebBrowser控件的HTML源代码读写