我可以通过 Chrome 中的本地消息传递嵌入程序(就像旧的 npapi 插件一样)吗?
Can i embed program through native messaging in Chrome (like old npapi plugins)?
是否可以创建 Chrome 可以将程序嵌入 Chrome 的扩展?我的意思是像 VLC 播放器、java 等旧的 NPAPI 插件...
我找到了一些本地消息传递的例子,但每个例子都只是为了发送简单的消息来控制外部程序。
但例如 IE Tab 使用本机消息传递,并且他们的 IE 选项卡引擎在 Chrome 内部 运行... 还是 IE Tab 使用其他东西?
更新的答案:
正如评论中所指出的,它显然使用了本地消息传递;我想不通的是他们在做什么。该项目声称是开源的(和 GPL),但在链接的 repo 中找不到源代码;最近的提交是 12 月 13 日,这几乎没有用。
通过查看扩展代码,我会 猜测 他们正在以某种方式使用某种有趣的 hackery 使用系统 API,Chrome long 可能不支持术语或某种未记录的 API;他们将文档标题设置为包含 'ietaba:' + IE 选项卡 ID,然后 post 使用该信息向本机消息主机发送一条消息。
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。这让我想知道 Google 是否给了他们特殊的 API 或者他们是否发现了一些聪明的 hack。 "GPL" 项目没有发布它的代码似乎有点可疑...
更新
深入挖掘后,我发现您可以枚举系统中打开的 HWND,以获取它们正在启动的选项卡的 HWND;他们在标题中设置了一个唯一的标签 ID,因此他们只是枚举 HWND,直到找到他们想要的那个。在那之后我想他们只是将 activex 控件实例化到那个位置。
也就是说,如果 Chrome 更改了错误的内容,这似乎很容易崩溃。我也不明白如何轻松定位页面的特定部分;你必须画到一个特定的区域,要让它完全正确是很棘手的。我不认为我想这样做,但我可以看到他们一定是怎么做的。
应该有人缠着他们发布他们的代码,因为他们不这样做就违反了 GPL。
进一步更新
为了验证事情,我尝试更改 "ATTACH" 事件以附加到 "Developer Tools"——结果我现在有了一个开发者工具 chrome window打开其中有一个网页。
是否可以创建 Chrome 可以将程序嵌入 Chrome 的扩展?我的意思是像 VLC 播放器、java 等旧的 NPAPI 插件... 我找到了一些本地消息传递的例子,但每个例子都只是为了发送简单的消息来控制外部程序。
但例如 IE Tab 使用本机消息传递,并且他们的 IE 选项卡引擎在 Chrome 内部 运行... 还是 IE Tab 使用其他东西?
更新的答案:
正如评论中所指出的,它显然使用了本地消息传递;我想不通的是他们在做什么。该项目声称是开源的(和 GPL),但在链接的 repo 中找不到源代码;最近的提交是 12 月 13 日,这几乎没有用。
通过查看扩展代码,我会 猜测 他们正在以某种方式使用某种有趣的 hackery 使用系统 API,Chrome long 可能不支持术语或某种未记录的 API;他们将文档标题设置为包含 'ietaba:' + IE 选项卡 ID,然后 post 使用该信息向本机消息主机发送一条消息。
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。这让我想知道 Google 是否给了他们特殊的 API 或者他们是否发现了一些聪明的 hack。 "GPL" 项目没有发布它的代码似乎有点可疑...
更新
深入挖掘后,我发现您可以枚举系统中打开的 HWND,以获取它们正在启动的选项卡的 HWND;他们在标题中设置了一个唯一的标签 ID,因此他们只是枚举 HWND,直到找到他们想要的那个。在那之后我想他们只是将 activex 控件实例化到那个位置。
也就是说,如果 Chrome 更改了错误的内容,这似乎很容易崩溃。我也不明白如何轻松定位页面的特定部分;你必须画到一个特定的区域,要让它完全正确是很棘手的。我不认为我想这样做,但我可以看到他们一定是怎么做的。
应该有人缠着他们发布他们的代码,因为他们不这样做就违反了 GPL。
进一步更新
为了验证事情,我尝试更改 "ATTACH" 事件以附加到 "Developer Tools"——结果我现在有了一个开发者工具 chrome window打开其中有一个网页。