监控WebBrowser的内容是否发生改变(转)

转自http://blog.sina.com.cn/s/blog_4b3906920100mqt0.html WebBrowser本身没有提供内容发生改变的事件,需要我们自己去实现。下面是delphi下的实现方法。 首先我们需要实现一个接口:IHTMLChangeSink。
在delphi的MSHTML单元里,delphi已经为我们声明了该接口,如下: IHTMLChangeSink = interface(IUnknown) ['{3050F64A-98B5-11CF-BB82-00AA00BDCE0B}'] function Notify: HResult; stdcall; end; 该接口很简单,只有一个方法:Notify.WebBrowser内容的改变就是通过该方法来告诉我们的,即当 WebBrowser的内容发生改变后,WebBrowser会调用该方法。
下面实现IHTMLChageSink接口: const WMContentChanged=WM_USER+66; type TNwHtmlDocumentNotify=class(TInterfacedObject,IHTMLChangeSink) private FHandle:THandle; function Notify: HResult; stdcall; constructor create(ProcessHandle:THandle); end; 上面的WMContentChanged会在实现中用到,请注意。 { TNwHtmlDocumentNotify }
constructor TNwHtmlDocumentNotify.create(ProcessHandle: THandle); begin FHandle:=ProcessHandle; end;
function TNwHtmlDocumentNotify.Notify: HResult; begin SendMessage(FHandle,WMContentChanged,0,0); Result:=S_OK; end;
说明:构造函数中的ProcessHandle是要处理消息WMContentChanged的窗口句柄。 当WebBrowser内容发生改变时,我们就给窗口发送一个消息。让窗口去处理它。
下面看如何用: procedure TMsgWriteForm.AddModifyNotify; var MakeContainer2:IMarkupContainer2; Doc:IHTMLDocument2; ChangeSkin:IHTMLChangeSink; ChangeLog:IHTMLChangeLog; Cokie:Cardinal; begin DOC:=FDoc; if FDoc=nil then DOc:=(wb1.Document as IHTMLDocument2); if Doc=nil then Exit; Doc.QueryInterface(IMarkupContainer2,MakeContainer2); ChangeSkin:=TNwHtmlDocumentNotify.create(self.Handle); MakeContainer2.CreateChangeLog(ChangeSkin,ChangeLog,1,1); //后面两个数中,至少要有一个为大于0的数 MakeContainer2.RegisterForDirtyRange(ChangeSkin,Cokie); //如果没有这句,将不会调用Notify函数 end;

将AddModifyNotify放在WebBrowser的DocumentComplete事件中,就可以了!
(注:这个是我的原创,转载请注意出处。谢谢!)

    推荐阅读