用 C# 编写的 Google chrome Extension Native Messaging 主机不在计算机启动时运行

Posted

技术标签:

【中文标题】用 C# 编写的 Google chrome Extension Native Messaging 主机不在计算机启动时运行【英文标题】:Google chrome Extension Native Messaging host written in C# is not run at computer startup 【发布时间】:2016-10-06 17:23:24 【问题描述】:

我开发了一个使用原生消息通信的 Google chrome 扩展程序。

嗯...扩展工作完美,但问题是本机消息主机未在计算机启动时启动。要启动它,我必须打开 chrome,列出扩展程序,找到我的扩展程序,然后禁用并重新启用它。

我意识到了一件事。是当我禁用并重新启用扩展并查看任务管理器时,我可以看到 3 个进程开始运行:chrome.exe、cmd 和我的本机消息传递主机 exe。

可能因为“cmd”命令,所有 3 个进程都没有在启动时启动?

为什么 cmd 命令与本机消息传递主机 exe 一起启动?如何避免?

编辑:

这是 manifest.json 文件:


  "manifest_version": 2,

  "name": "Busca Cliente Lipigas",
  "short_name": "Busca Cliente",
  "description": "Permite recibir un número de teléfono desde SoftPhone y realizar la búsqueda del cliente en la página Web de Lipigas.",
  "version": "1.1",

  "permissions": [
    "tabs",
    "background",
    "nativeMessaging"
  ],

  "icons" :  "16": "img/icon16.png",
              "48": "img/icon48.png",
              "128": "img/icon128.png" ,

  "background": 
    "scripts": ["main.js"],
    "persistent": false
    


编辑:

这是背景页面:

var clientSearchPage;
var clientEditPage;
var executed;

//console.log('Extensión iniciada.');
var port = chrome.runtime.connectNative('com.desytec.lipigas.sll');

port.onMessage.addListener(function (msg) 
    //console.log("Se recibió el comando " + msg.command + ' con el parámetro ' + msg.parameter);

    port.postMessage( status: processCommand(msg.command + ' ' + msg.parameter) );
);

chrome.runtime.onSuspend.addListener(function () 
    port.postMessage( status: 'EXIT' );
)

function processCommand(cmd)     
    var parts = cmd.split(/\s+/);
    try 
        switch (parts[0]) 
            case 'Phone':
                executed = false;
                setPhone(parts[1]);
                return '+OK-Phone';
            case 'SetClientSearchPage':
                clientSearchPage = parts[1];
                if (clientSearchPage[0] != '/')
                    clientSearchPage = '/' + clientSearchPage;
                //console.log('Se configuró la página de búsqueda del cliente ' + clientSearchPage);
                return '+OK-SetClientSearchPage';
            case 'SetClientEditPage':
                clientEditPage = parts[1];
                if (clientEditPage[0] != '/')
                    clientEditPage = '/' + clientEditPage;
                //console.log('Se configuró la página de edición del cliente ' + clientEditPage);
                return '+OK-SetClientEditPage';
            default:
                return '+ERR-Comando No Encontrado';
        
        //tcpConnection.sendMessage(Commands.run(cmd[0], cmd.slice(1)));
     catch (ex) 
        return '+ERR-Comando No Procesado'
    


function setPhone(phone) 
    chrome.tabs.query(
    , function (tabs) 
        var tab = null;

        for (var i = 0; i < tabs.length; i++) 
            var tabURL = tabs[i].url;
            if (tabURL.indexOf(clientSearchPage) != -1 || tabURL.indexOf(clientEditPage) != -1)
                tab = tabs[i];
            //console.log(tabURL);
        

        if (!executed) 
            searchClient(tab, phone);
            executed = true;
        
    );


function searchClient(tab, phone) 
    if (tab == null)
        console.log('No se encontró ninguna de las páginas del cliente: ' + clientSearchPage + ', ' + clientEditPage);
    else 
        var site = '';
        var url = tab.url;
        if (url.indexOf(clientEditPage) != -1)
            site = url.substr(0, url.indexOf(clientEditPage));
        else if (url.indexOf(clientSearchPage) != -1)
            site = url.substr(0, url.indexOf(clientSearchPage));

        //console.log(site + clientSearchPage + '?telefono=' + phone);

        chrome.tabs.update(tab.id,  active: true, url: site + clientSearchPage + '?telefono=' + phone );

        //console.log('Se actualizó la URL con: ' + site + clientSearchPage + '?telefono=' + phone);
    

【问题讨论】:

【参考方案1】:

    由于本机消息传递主机仅由 chrome.runtime.connectNative 启动,与 the documentation 一样,您需要在计算机启动时通过在扩展程序的 manifest.json 中指定 "background" permission 来启动扩展程序:

    "permissions": ["background", "nativeMessaging"],
    

    当任何已安装的托管应用程序、打包应用程序或扩展程序具有“后台”权限时,Chrome 会在用户登录其计算机后立即(不可见地)运行 - 在用户启动 Chrome 之前。 “后台”权限还可以让 Chrome 继续运行(即使在其最后一个窗口关闭之后),直到用户明确退出 Chrome。

    用户可以在 Chrome 的设置中禁用此行为:[x] Continue running background apps when Google Chrome is closed 选项。

    cmd 被启动以创建 stdio 管道。在 Windows 上,命令行是:

    C:\Windows\system32\cmd.exe /c YOURHOSTAPP.exe --parent-window=10158736 chrome-extension://knldjmfmopnpolahpmmgbagdohdhkik/ \.\管道\chrome.nativeMessaging.out.9c12d69ad9deb1ce

    As of Oct 5, 2016 --parent-window= 参数将移动到chrome-extension:// 之后。

【讨论】:

我已经用清单文件更新了这个问题。这是你展示的方式。但是,正如我所说,当我手动禁用然后重新启用扩展时会启动本机消息传递主机......所以我认为 json 文件是正确的。甚至,当我关闭 Chrome 时,本机消息传递主机继续运行。该问题仅在计算机启动时发生(本机消息传递主机未自动启动) @jstuardo 你应该展示你如何称呼connectNative 我在问题中添加了背景页面。 connectNative 出现在开头,这是: var port = chrome.runtime.connectNative('com.desytec.lipigas.sll');...... 在计算机启动时,扩展似乎已启用,我认为它通过了通过后台页面....可能在该代码的某些部分中存在导致本机消息传递主机无法启动的错误 @jstuardo,试试"persistent": true。此外,如果在 chrome://extensions 页面上为您的扩展启用了 Collect errors 复选框,您可以查看错误 @wOxxOm 那个复选框在哪里?我加载了扩展页面,但没有看到类似的内容。

以上是关于用 C# 编写的 Google chrome Extension Native Messaging 主机不在计算机启动时运行的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 C# 启动具有特定 URL 的 Google Chrome 选项卡

如何使用 C# 在 WPF 中开发类似 Google Chrome 浏览器的应用程序

使用 google-chrome cli 选项打开多个 PWA

我的 google-chrome 扩展是不是有一个 chrome.* API 来找出它在哪些页面上被禁止编写脚本?

从 Google Chrome 扩展程序启动外部应用程序?

使用C#像google/zx一样编写脚本