监控 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
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?