Google chrome extension 当用户关闭Chrome时关闭本机主机 我正在使用一个C++原生主机的Chrome扩展。在后台.js脚本(持久设置为false)中,使用Chrim.OnScRead事件,创建与C++主机的连接。

Google chrome extension 当用户关闭Chrome时关闭本机主机 我正在使用一个C++原生主机的Chrome扩展。在后台.js脚本(持久设置为false)中,使用Chrim.OnScRead事件,创建与C++主机的连接。,google-chrome-extension,chrome-native-messaging,Google Chrome Extension,Chrome Native Messaging,我希望我的主机在用户积极使用Chrome的情况下一直运行 如果我关闭所有当前的Chrome选项卡,独立的Chrome进程仍会出现在任务管理器的“后台”部分(包括必须明确终止的主机进程) 我知道用户可以将Chrome配置为不运行后台进程,但我可以将扩展设计为在用户关闭所有Chrome选项卡时终止主机进程(断开端口连接) 此外,如果禁用扩展,问题会变得更严重。主机进程在后台成为分离的进程。如果再次启用扩展,杀死所有已处理的Chrome并重新启动Chrome(因为我的扩展在Chrome启动时连接到主机

我希望我的主机在用户积极使用Chrome的情况下一直运行

如果我关闭所有当前的Chrome选项卡,独立的Chrome进程仍会出现在任务管理器的“后台”部分(包括必须明确终止的主机进程)

我知道用户可以将Chrome配置为不运行后台进程,但我可以将扩展设计为在用户关闭所有Chrome选项卡时终止主机进程(断开端口连接)


此外,如果禁用扩展,问题会变得更严重。主机进程在后台成为分离的进程。如果再次启用扩展,杀死所有已处理的Chrome并重新启动Chrome(因为我的扩展在Chrome启动时连接到主机),我将有多个主机进程

当Chrome终止或卸载您的扩展时,它将向您的本机消息主机发送
-1
消息。您必须检查该值,假设您的本地消息传递主机是用C++编写的,那么这就是您应该做的:

int read_char = ::getchar();
if (read_char == -1) {
// Do termination work here...
}

听起来您可能已经指定了
“权限”:[“后台”]
,在这种情况下,您可以在chrome.windows.onRemoved侦听器中检测到最后一个关闭的窗口。也许你可以删除这个权限,这样端口就会自动关闭。如果仍然没有,那可能是Chrome中的一个bug,你仍然可以绕过它,但这是一个黑客行为。我添加了权限['tabs',]并创建了两个事件侦听器。一个在创建新窗口时激发的函数,它具有一个回调函数,如果端口为空,则该函数将连接到主机。另一个侦听器在删除窗口时激发,最后一个窗口应断开端口连接(在全局变量端口上调用port.disconnect())。我按照日志进行操作,所有事情似乎都按正确的顺序进行,但是当我打开任务管理器时,主机进程仍然处于活动状态(独立运行)。我是否正确断开了主机连接?您是否正在侦听来自Chrome的消息?Chrome将在终止之前向您的本机消息主机发送
-1
。因此,您必须检查char值是否等于-1,如果是,则执行终止工作谢谢@Asesh的回答。没错,当Chrome进程被终止时,它会发送“-1”,而不是表示消息长度的4个字节。我在任何地方都没有看到这个。我在主机中为负长度添加了一个特例,它退出while循环,在该循环中主机持续等待扩展消息(因此主机进程终止)。再次感谢你!很高兴这有帮助。我已经在下面发布了这个答案,以便对其他人有所帮助。