编写chrome插件,调用本地应用程序,并进行通讯(发送信息给应用程序)

开发说明

1、浏览器插件实现
manifest.json文件内容。每个chrome的插件都需要该文件,该文件记录插件的关键信息

{
    "name" : "callapp",
    "version" : "1.0.1",
    "description" : "call local application",
    "background" : { "scripts": ["background.js"] },
    "icons": {
        "16": "16.png",
        "128": "128.png"
    },
    "permissions" : [
    "nativeMessaging",
    "contextMenus",
    "tabs"
    ],
    "minimum_chrome_version" : "6.0.0.0",
    "manifest_version": 2
}

其中由于需要在右键菜单中增加选项,在permissions中增加"nativeMessaging"、"contextMenus"两项;需要和本地程序进行通讯,增加"nativeMessaging"项

maniffest.json所需要的background.js

//Author: jyx
//Date: 2014.10.11
//Description: This is a javaScript file use for handle contextMenus action
//When click the contextMenus, it will sent the infomation to native app

//connect to native app
var port = null;
var nativeHostName = "com.ctrip.ops.mysql.callapp";//chrome与本地程序通信的桥梁,根据该名称进行配置项的寻找。windows下在注册表HKEY_CURRENT_USER\Software\Google\Chrome\NativeMessagingHosts内寻找,linux下在目录/etc/opt/chrome/native-messaging-hosts/寻找该名称的json文件(本例子为com.ctrip.ops.mysql.callapp.json)

//onNativeDisconnect
function onDisconnected()
{
    //alert("连接到FastDownload服务失败: " + chrome.runtime.lastError.message);
    port = null;
}

//connect to native host and get the communicatetion port
function connectToNativeHost()
{
    port = chrome.runtime.connectNative(nativeHostName);//根据配置文件连接到本地程序
    port.onDisconnect.addListener(onDisconnected);
}

//调用connectToNativeHost函数连接到本地程序,完成后使用port.postMessage函数将纤细传递给应用程序
//将信息写入I/O流与本地程序通信
function getClickHandler() {
      return function(info, tab) {
        connectToNativeHost();
        port.postMessage(info.linkUrl);
      };
};

//在浏览器启动时即创建右键菜单,在页面链接上右击鼠标会显示该菜单,当点击"start program"的时候就会调用getClickHandler()函数处理
 chrome.contextMenus.create({
    "title" : "start program",
    "type" : "normal",
     "id": "callapp",
    "contexts" : ["link"],
     "enabled": true,
    "onclick" : getClickHandler()
});

程序中nativeHostName需要特殊说明,正是通过该变量,chrome的插件找到调用本地程序的配置
本文的实验环境为windows7,在注册表的HKEY_CURRENT_USER\Software\Google\Chrome\NativeMessagingHosts中创建对应的项,注册表导出内容如下Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Google\Chrome\NativeMessagingHosts\com.ctrip.ops.mysql.callapp]
@="D:\\temp\\chromeExtension\\callapp\\callapp.json"

linux下参考http://match-yang.blog.163.com/blog/static/2109902542014319103739996/

2、浏览器调用配置

callapp.json
该文件的路径保存在注册表的HKEY_CURRENT_USER\Software\Google\Chrome\NativeMessagingHosts\com.ctrip.ops.mysql.callapp项内

{
    "name": "com.ctrip.ops.mysql.callapp",
    "description": "Chrome call native app and sent message to app.",
    "path": "C:\\MyApp.exe",
    "type": "stdio",
    "allowed_origins": [
        "chrome-extension://imcfacgnnkhdheiajocckejfmeiokgol/"
    ]
}

3、本地应用程序例子

使用C#进行开发,C++参考http://match-yang.blog.163.com/blog/static/2109902542014319103739996/

using System;
using System.IO;

namespace ConsoleApplication8
{
    class Program
    {
        static void Main(string[] args)
        {
            log2file("--------------------program start at " + DateTime.Now.ToString() + "--------------------");
            if (args.Length != 0)
            {
                for (int i = 0; i < args.Length; i++)
                    log2file("arg " + i.ToString() + args[i]);

                string chromeMessage = OpenStandardStreamIn();
                log2file("--------------------My application starts with Chrome Extension message: " + chromeMessage + "---------------------------------");
            }
            log2file("--------------------program end at " + DateTime.Now.ToString() + "--------------------");
        }
        static void log2file(string s)
        {
            FileStream fs = new FileStream(@"c:\test.log", FileMode.Append);
            StreamWriter sw = new StreamWriter(fs);
            sw.WriteLine(s);
            sw.Close();
            fs.Close();
        }

        private static string OpenStandardStreamIn()
        {
            //// We need to read first 4 bytes for length information
            Stream stdin = Console.OpenStandardInput();
            int length = 0;
            byte[] bytes = new byte[4];
            stdin.Read(bytes, 0, 4);
            length = System.BitConverter.ToInt32(bytes, 0);

            string input = "";
            for (int i = 0; i < length; i++)
            {
                input += (char)stdin.ReadByte();
            }

            return input;
        }
    }
}

说明:
background.js代码根据如下链接,进行了一些非框架性的修改,主要是注释,不过还是修改了一下author
http://match-yang.blog.163.com/blog/static/2109902542014319103739996/

参考:
讲解如何在浏览器的右键菜单中增加
http://my.oschina.net/ruben/blog/92813
讲解调用本地的应用程序
http://match-yang.blog.163.com/blog/static/2109902542014319103739996/
http://blog.csdn.net/talking12391239/article/details/38498557#

时间: 2024-10-05 03:11:49

编写chrome插件,调用本地应用程序,并进行通讯(发送信息给应用程序)的相关文章

Chrome 插件: 起动本地应用 (Native messaging)

Chrome 插件: 起动本地应用 (Native messaging) www.MyException.Cn  网友分享于:2014-08-01  浏览:3次 Chrome 插件: 启动本地应用 (Native messaging) 最近碰到了一个新问题,需要利用Chrome 的插件, 从我们的一个网站中启动一个我们的本地C#应用,同时给这个应用传值来进行不同的操作. 在这里记录下解决的过程,以便以后查找 首先我们需要新建一个google的插件 这个插件包含了三个文件 manifest.jso

开发一个简单的chrome插件-解析本地markdown文件

准备软件环境 1. 软件环境 首先,需要使用到的软件和工具环境如下: 一个最新的chrome浏览器 编辑器vscode 2. 使用的js库 代码高亮库:prismjs https://prismjs.com/download.html markdown解析库:marked.min.js https://github.com/markedjs/marked 搭建工程 创建一个md-reader目录,进入md-reader目录 1. 目录结构 然后,创建需要的文件 md-reader |----sr

chrome 浏览器插件开发(二)—— 通信 获取页面 编写chrome插件专用的库

在chrome插件的开发过程中,我遇到了一些问题,在网上找了不少文章,可能是浏览器升级的原因,有一些是有效的也有无效的.下面我简单的分享一下我遇到的坑,以及我把这些坑的解决方案整理而成的js库 —— crxTool . 一.坑和铲子 1.browser action或page action与content script通信 在网上找了不少方法,最后选择的方法如下: 发送消息: 1 var send= function(data, cb){ 2 chrome.tabs.query({active:

Linux下的C程序如何调用系统命令,并获取系统的输出信息到C程序中

直接贴代码: #include <stdio.h> #include <string.h> #include <errno.h> int main(int argc,char*argv[]) { FILE *fstream=NULL; char buff[1024]; memset(buff,0,sizeof(buff)); if(NULL==(fstream=popen("uname -a","r"))) { fprintf(s

chrome插件编写之新版hello world

编写chrome插件之前,需要熟悉一下相应的chrome插件开发环境.从编写hello world开始,参考阅读官方的教程,是一个不错的选择.这里主要是基于chrome的官方教程,稍稍做了一些修改和扩充,总结成了如下的几个部分. 在chrome中编写插件和写网页应用基本一致,采用的是javascript+css+html的方式.所以对于用过chrome浏览器审阅过一些网页的源码,写过网页或者脚本的人而言,编写chrome的插件感觉到还是比较熟悉的. 一.chrome插件和用户的几种交互方式 比较

在chrome中,调用本地摄像头

原文地址:https://blog.csdn.net/journey191/article/details/40744015 <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>HTML5 GetUserMedia Demo</title> <meta name="viewport" content=&qu

如何离线安装chrome插件

前言------可以不看: 实习做web,要弄单点登录SSO和验证Controller接口是否成功返回数据,要装两个chrome插件(Postman和JsonView),来发送Post请求测试单点登录(因为url只能是get请求). 以前做C++,写IOS,写Qt的娃,现在搞web真的有点虚,真是苦逼,一大堆货. google都不能访问了,google的应用商店也明显不能访问了.我又懒得找翻墙软件,真是懒......还是离线装装好了. (每次博客也一大堆错别字,别在意这些细节,最近右手手腕很疼,

chrome浏览器插件启动本地应用程序

chrome浏览器插件启动本地应用程序 2014-04-20 00:04:30|  分类: 浏览器插件|举报|字号 订阅 下载LOFTER我的照片书  | chrome的插件开发这里就不多讲了,本篇文章只讲如何调用谷歌浏览器的api启动本地的程序并与之通信 要启动本地的应用插件需要包括两部分的内容: 1)安装到浏览器的插件部分 2)放置在本地的json文件 第一部分就跟普通的谷歌浏览器插件是一样的,包括两个必须的文件: 1)background.js(名字不一定为background......

HTML网页调用本地Python程序

1.写好一个test.py用作调用 2.编写html代码,test.html <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <script language="javascript"> function exec1(command) { var ws = new ActiveXObject("WScript.Shell"); w