用C#编写的Google Chrome扩展Native Messaging主机不能在计算机启动时运行

时间:2016-10-06 17:23:25

标签: c# windows google-chrome google-chrome-extension chrome-native-messaging

我开发了一个使用Native Messaging通信的Google Chrome扩展程序。

嗯...扩展功能完美,但问题是Native Messaging主机未在计算机启动时启动。要启动它,我必须打开chrome,列表扩展,找到我的扩展,然后禁用并重新启用它。

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

也许所有3个进程都没有在启动时启动,因为" cmd"命令?

为什么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 个答案:

答案 0 :(得分:2)

  1. 由于本地消息传递主机仅按chrome.runtime.connectNative"permissions": ["background", "nativeMessaging"], 启动,因此您需要在计算机启动时通过在扩展程序清单中指定the documentation来启动扩展程序上传.json:

    [x] Continue running background apps when Google Chrome is closed
      

    如果任何已安装的托管应用,打包应用或扩展程序具有“后台”权限,则只要用户登录其计算机,Chrome就会立即运行(无形) - 在用户启动Chrome之前。 “后台”权限还允许Chrome继续运行(即使在最后一个窗口关闭后),直到用户明确退出Chrome。

    用户可以在Chrome的设置中禁用此行为:
    cmd选项。

  2. 启动
  3. --parent-window=以创建stdio管道。在Windows上,命令行为:

      

    C:\ Windows \ system32 \ cmd.exe / c YOURHOSTAPP.exe --parent-window = 10158736 chrome-extension:// knldjmfmopnpolahpmmgbagdohdnhkik /&lt; \。\ pipe \ chrome.nativeMessaging.in.9c12d69ad9deb1ce&gt; \。\管\ chrome.nativeMessaging.out.9c12d69ad9deb1ce

    "background" permission chrome-extension://参数将在git checkout -b mybranch之后移动。