监控 WebBrowser 控件内容的改变

今天的收获只有一项,那就是这个啦。。。
呵呵, 主要的就是用到mshtml.IHTMLChangeSink 中的 Notify方法触发自定义的事件,具体的代码我也不懂,嘿嘿 这些都是从 东西市 Copy 来的,乱的成粥了。

 
  
几点核心代码:


public class Monitor : mshtml.IHTMLChangeSink
{
// for monitor htmleditor textchanged
private Guid IMarkupContainer2GUID = typeof (mshtml.IMarkupContainer2).GUID;
   
private uint cookie = 0 ;

private mshtml.IMarkupContainer2 markupContainer;

  
private WebBrowser webBrowser;

   
// Event
public event Action HtmlEditorEvent;


 
public Monitor(WebBrowser webControl)

   {
      
this .webBrowser = webControl;
}


#region For HtmlEditor TextChanged

// always monitor
private mshtml.IMarkupContainer2 GetMarkupContainer()
{
object oDocument = this .webBrowser.Document.DomDocument;

IntPtr pDocument
= Marshal.GetIUnknownForObject(oDocument);

IntPtr pMarkupContainer
= IntPtr.Zero;

// pMarkupContainer is different after a call to Navigate or designMode

Marshal.QueryInterface(pDocument,
ref IMarkupContainer2GUID, out pMarkupContainer);

// object oMarkupContainer = Marshal.GetObjectForIUnknown(pMarkupContainer); // This does not work

object oMarkupContainer = Marshal.GetUniqueObjectForIUnknown(pMarkupContainer);

Marshal.Release(pDocument);

Marshal.Release(pMarkupContainer);

return (mshtml.IMarkupContainer2)oMarkupContainer;

}


// only one monitor
private mshtml.IMarkupContainer2 GetMarkupContainer2()
{
return (mshtml.IMarkupContainer2) this .webBrowser.Document.DomDocument;
}


public void MonitorTextChangedAlways()
{
this .markupContainer = GetMarkupContainer();

this .markupContainer.RegisterForDirtyRange((mshtml.IHTMLChangeSink) this , out this .cookie);
}


public void StopMonitorTextChanged()
{
if ( this .markupContainer != null )
{
this .markupContainer.UnRegisterForDirtyRange( this .cookie);
}
}

#endregion


#region Implement Interface

public void Notify()
{
// 触发改变事件外界去接受
if ( this .HtmlEditorEvent != null )
{
this .HtmlEditorEvent();
}
}

#endregion


}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值