我会帮助您解决我熟悉的部分问题(基于 JavaScript 的插件),并为其他部分提供一些建议。什么都没有!
附加组件
Firefox 附加组件可轻松提供检测页面加载和打开/关闭 Firefox 所需的工具。
要检测页面加载,您可以在窗口中注册DOMContentLoaded 事件的侦听器。
window.addEventListener("DOMContentLoaded", function(event){
var url = event.originalTarget.location.href;
alert("Oh yeah, a document is loading: " + url);
}, false);
或者,您可以注册nsIWebProgressListener 以收听location changes。这可能更接近您想要的,因为 iframe 也会触发 DOMContentLoaded。
var listener = {
//unimplemented methods (just give functions which do nothing)
onLocationChange: function(aWebProgress, aRequest, aLocation){
var url = aLocation.asciiSpec;
alert("Oh yeah, a the location changed: " + url);
}
};
gBrowser.addTabsProgressListener(listener);
要检测 firefox 打开/关闭,您首先需要了解 firefox 插件如何在多个窗口中工作。当启动一个新的 Firefox 窗口时,您基本上有 2 个单独的代码副本在运行。因此,如果您关心 firefox windows 的打开和关闭,您可以这样做:
window.addEventListener("load", function(event){
alert("Looks like you just opened up a new window");
}, false);
window.addEventListener("unload", function(event){
alert("Awh, you closed a window");
}, false);
但是,您很可能想要检测作为整个应用程序打开/关闭 firefox。这是使用称为Javascript Modules 的代码共享机制实现的。 Javascript 模块在应用程序的生命周期内只加载一次。因此,它们使您能够在窗口之间共享信息。简单地计算打开和关闭的窗口数量就足够了。
var EXPORTED_SYMBOLS = ["windowOpened", "windowClosed"];
var windowsOpened = 0;
function windowOpened(){
if( windowsOpened === 0) {
alert("The first window has been opened!");
}
windowsOpened++;
}
function windowClosed(){
windowsOpened++;
if( windowsOpened === 0) {
alert("The last window has been closed!");
}
}
然后您可以简单地附加上述事件处理程序,从它们对应的load 和unload 事件中调用这两个方法。
所以,这一切都很好,但现在您必须纠结于获取基线 Firefox 插件设置的细节。幸运的是,Mozilla 提供了一个方便的Addon Builder 来解决这个问题。所有关于(Javascript 模块除外)的代码都应该放在 ff-overlay.js 文件中(假设您使用链接的构建器)。
C# 通信
我对使用 C# 的进程间通信知之甚少。不过,也许我可以为您指明正确的方向,让 SO 的聪明人来填补其余部分。
我相信 COM 对象 是 Windows 上进程之间的一种通信方法。因此,您可以在附加组件中构建 Binary Component 以执行通信。但是,据我了解,设置二进制组件比标准的基于 javascript 的附加组件要困难得多。无论哪种方式,Mozilla 都提供了一个 guide 用于在 Visual Studio 中进行设置。
如果您想远离二进制组件,您只剩下 SDK 中启用了 javascript 的组件。这包括套接字通信、文件、管道、sqlite 数据库等。SO question 正好解决了您要问的问题。如果是我,我会按照这个顺序选择它们。
- Sqlite 数据库
- 命名管道
- 套接字
(1) 因为有很多代码示例可用于此,并且在双方都易于实现。 (2) 因为如果我完全控制应用程序的双方,这将是我实施 IPC 的方式。 (3) 是最后一个,因为我讨厌那些废话(也许我在大学时对分布式系统有偏见)。
tl;博士
页面加载的东西应该很简单。查看 Addon Builder 以开始使用 FF 插件,查看 here 以了解检测页面加载。
C# 通信是可行的,并在此SO Question 中解决。如果是我,我会使用 sqlite 数据库轻松完成。