连接Firefox扩展与c#应用程序
Connect Firefox extension with C# application
我需要能够创建一个事件,这样每当用户加载新页面并关闭firefox时,我需要它调用c#应用程序中的一个方法,该方法负责维护用户模型。我知道我肯定需要创建某种类型的firefox扩展,我使用javascript来检查这样的事件。但是,我不知道如何将我的c#应用程序与firefox扩展集成。有人能给我一些指导吗?
我将帮助您解决问题中我熟悉的部分(基于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来监听位置的变化。这可能更接近您想要的,因为DOMContentLoaded
也为iframe触发。
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的一个新窗口启动时,你基本上有两个独立的代码副本在运行。因此,如果您关心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模块的代码共享机制实现的。在应用程序的生命周期内,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来解决这个问题。about的所有代码(Javascript模块除外)都应该放在off -overlay.js文件中(假设您使用了链接的构建器)。
c#沟通
我对c#的进程间通信知之甚少。然而,也许我可以给你指出正确的方向,让那些聪明的人来填补剩下的部分。
我相信COM对象是Windows上进程间通信的一种方法。因此,您可以在附加组件中构建二进制组件来执行通信。然而,据我所知,设置二进制组件比标准的基于javascript的插件要困难得多。无论哪种方式,Mozilla都提供了在Visual Studio中设置它的指南。
如果你不想使用二进制组件,那么你只能使用SDK中启用javascript的组件。这包括套接字通信、文件、管道、sqlite数据库等。这个问题正好回答了你要问的问题。如果是我,我会按这个顺序选择它们。
- Sqlite数据库
- 命名管道
- 套接字
(1),因为有很多代码示例可用于此,并且很容易在两边实现。(2)因为这将是我实现IPC的方式,如果我被赋予对应用程序双方的完全控制。(3)是最后一个,因为我讨厌那些废话(也许我在大学里对分布式系统有偏见)。
<标题> tl;博士页面加载应该非常简单。查看Addon Builder来使用FF插件,并在这里查看如何检测页面加载。
c#通信是可行的,并在此SO问题中解决。
标题>- 通过chrome后台扩展或后台应用程序访问用户麦克风
- 访问可扩展QML应用程序中的列表视图索引
- 扩展成员应用程序,包括新的路线,现在没有任何渲染
- 如何显示带有Google Packaged应用程序或扩展程序的托盘图标
- Chrome扩展应用程序在安装后不会显示徽标图像
- 如何将 Backbonejs 用于大型可扩展应用程序
- 扩展 console.log() 的 javascript Web 应用程序的客户端日志记录
- 如何在Chrome OS或Chrome扩展程序的打包应用程序中启用摄像头和麦克风
- Chrome 扩展程序 / 应用程序设置 Javascript
- 在 Web 应用和扩展程序之间共享本地存储
- 为什么浏览器扩展程序比纯基于 Web 的应用程序更安全
- 如何将 Chrome 扩展程序转换为 Chrome 应用程序
- React(来自Facebook的应用程序框架)和react.js(JS的反应式扩展)之间有什么区别/相似之处
- 从chrome扩展向chrome应用程序发送消息
- 当不同的应用程序有焦点时,有没有一种方法,可能使用chrome扩展,让chrome在窗口中成为焦点
- 在应用商店中使用Apache Cordova MS VS扩展保护应用程序
- 在ios 8应用程序扩展javascript文件中使用jQuery
- 将Node.js应用程序扩展到1000个同时连接中的10个
- 如何使用OAuth与Facebook在Safari应用程序扩展
- 如何在IOS操作应用程序扩展中调试JavaScript