是否可以创建可以将程序嵌入 Chrome 的 Chrome 扩展程序?我的意思是像 VLC 播放器、java 等旧的 NPAPI 插件之类的东西......我找到了一些原生消息传递示例,但每个示例仅用于发送简单消息以控制外部程序。
但是例如 IE Tab 使用的是本机消息传递,并且他们的 IE tab 引擎在 Chrome 中运行......或者 IE Tab 使用其他东西?
是否可以创建可以将程序嵌入 Chrome 的 Chrome 扩展程序?我的意思是像 VLC 播放器、java 等旧的 NPAPI 插件之类的东西......我找到了一些原生消息传递示例,但每个示例仅用于发送简单消息以控制外部程序。
但是例如 IE Tab 使用的是本机消息传递,并且他们的 IE tab 引擎在 Chrome 中运行......或者 IE Tab 使用其他东西?
更新的答案:
正如评论中所指出的,它显然使用了本机消息传递;我想不通的是他们在做什么。该项目声称是开源的(和 GPL),但在链接的 repo 中找不到源代码;最近的提交是 12 月 13 日,这几乎没有用处。
通过查看扩展代码,我猜想他们正在以某种方式使用某种有趣的黑客技术,使用 Chrome 长期可能不支持的系统 API 或某种未记录的 API;他们将文档标题设置为包含“ietaba:”+ IE 选项卡 ID,然后使用该信息向本机消息主机发布消息。
chrome.tabs.getCurrent(function(tab) {
// We can't attach if we don't have a window id or aren't active
if (!tab.active || !this.windowId) {
this.restoreTitle();
return;
}
// Remember the title change is asynchronous, so don't keep changing it or the helper
// will never find it. We may have to retry several times to find the window after
// a single title change
if (document.title.indexOf('ietaba:') == -1) {
this.realTitle = document.title;
document.title = 'ietaba:' + Background.getNextIETabId();
}
var msg = {
type: 'ATTACH',
tabTitle: document.title,
innerWidth: this.getIEWidth(),
innerHeight: this.getIEHeight()
}
NativeHost.postMessage(msg);
}.bind(this));
我想不通的是他们如何使用它来附加它;他们似乎以某种方式获得了该部分的 HWND。这让我想知道谷歌是否给了他们特殊的 API,或者他们是否发现了一些聪明的 hack。“GPL”项目没有发布它的代码似乎有点可疑......
更新
在进行了更多挖掘之后,我发现您可以枚举系统中打开的 HWND 以获取它们正在启动的选项卡的 HWND;他们在标题中设置了一个唯一的选项卡 ID,因此他们只会枚举 HWND,直到找到他们想要的那个。在那之后,我想他们只是将 activex 控件实例化到那个位置。
也就是说,如果 Chrome 更改了错误的内容,这似乎很容易破坏。我也看不出您如何轻松定位页面的特定部分。你必须要画到一个特定的区域,要让它完全正确会很棘手。我不认为我想这样做,但我可以看到他们必须这样做。
有人应该纠缠他们发布他们的代码,因为他们不这样做就违反了 GPL。
进一步更新
只是为了验证一下,我尝试将“ATTACH”事件更改为附加到“开发者工具”——结果我现在打开了一个开发者工具 chrome 窗口,其中包含一个网页。