2009-09-12 81 views
3

我一直在研究用C#编写的BHO /工具栏,该工具栏用于侦听浏览器当前网页中引发的HTML事件。该解决方案包含一个名为HtmlPageEventManager的可重用类,其目的是为每个打开的新网页订阅HTML事件的给定列表。目标是在用户可以开始与页面元素进行交互之后立即附加处理程序,即使在页面加载完成之前也是如此。使用这个类很简单 - 只需要调用构造函数:从BHO收听HTML事件

var evts = new List() { 
    HtmlEvent.onclick, HtmlEvent.ondblclick, HtmlEvent.onkeydown, 
    HtmlEvent.onselectstart, HtmlEvent.onselectionchange, 
    HtmlEvent.onfocus, HtmlEvent.onselect 
}; 
new HtmlPageEventManager(this, evts, this.HtmlEventHandler);

download my solution here尝试一下,并给我反馈。如果您觉得它有用,请随意在自己的项目中使用它。虽然它运作良好,但有些时候它无法附加事件。我很难指出这些情况。所以我可以使用一些帮助改进HtmlPageEventManager。

我的解决方案引用了SpicIE的程序集,但它们未包含在上述下载中,因此您需要从the SpicIE website获取它。顺便说一句,这可能是个好时机:SpicIE有多受欢迎?任何更好的工具使用?

+0

我发现一个可重现的情况,HtmlPageEventManager无法附加事件。当你最初打开一个网页时,它可以在95%的时间内正常工作。但是,当您“刷新”该页面时,事件注册将丢失。遍历调试器,一切都如预期的那样。 Google搜索(http://www.google.com/search?q=IWebBrowser2+detect+refresh)显示这是一个常见问题。这看起来并不像我有时间单独追求这一点。所以如果你有兴趣以这种方式帮助改进HtmlPageEventManager,请在这里发布和/或联系我。 – HappyNomad 2009-09-12 18:33:16

回答

2

是啊!我通过订阅BHO的DownloadComplete事件克服了“刷新”问题,我再次调用我的“RegisterEventHandlers”辅助方法来附加HTML事件处理程序。代码jeffamaphone链接到是有帮助的。我结合了它的“normalPageLoad”成员变量的想法来有条件地调用RegisterEventHandlers。我也看着the accompanying forum post。不过,我无法理解对父窗口Loaded事件的强调。我的代码工作甚至没有做到这一点。无论如何,我认为HtmlPageEventManager现在是完全有效的 - 敲木头。如果你发现一个还没有完成工作的案子,请给我一个留言。

0

你会发现没有100%的解决方案在页面加载期间为IE做这件事。这不是你的错:IE的事件模型是一个巨大的意大利面条异步代码,这使得很难得到正确的代码。如果你有一个95%的解决方案,我说很高兴,继续前进。

+0

如果你看看HtmlPageEventManager,你会发现我已经和一个灵活的解决方案相结合了,这个解决方案包含了巨大的意大利面条。这个想法是为了让其他人可以从中受益,将细节隐藏在这个可重用的组件中。不错,我确实需要继续前进。这就是为什么我希望找到能帮助我改进的人。现在的问题是,每次用户刷新网页,事件就会停止处理,我的插件停止运行。 – HappyNomad 2009-09-12 20:16:51

+0

是的,试图在IE中处理刷新事件是一个总的嗡嗡声。你可以看看John Lister在DemoButton中做了些什么。 http://code.google.com/p/pricegoblin/wiki/DemoButton – 2009-09-12 23:50:27