Chrome 小工具: 启动本地应用 (Native messaging)

最近遇到一个新的问题。需要使用Chrome 插件, 从我们对我们当地的一个网站之一启动C#应用,同时通过本申请值执行不同的操作。

在这里记录下解决的过程。以便以后查找

首先我们须要新建一个google的插件 这个插件包括了三个文件

manifest.json(名字不可改, 建插件必须文件),background.js(文件名称可改, 后台文件),content.js(content script文件 负责与站点页面交互)

首先我们来看看manifest.json 这个文件

<span style="font-family:SimSun;font-size:18px;">{
	"name" : "FastRun",
	"version" : "1.0.1",
	"description" : "Launch APP ",
	"background" : { "scripts": ["background.js"] },

	"permissions" : [
		"nativeMessaging",
		"tabs",
		"http://xxx/*"
	],
	"content_scripts": [
    {
      "matches": ["http://xxx/*"],
      "js": ["content.js"]
    }
	],
	"minimum_chrome_version" : "6.0.0.0",
	"manifest_version": 2
}</span>

里面的premissions很重要, 他表示我们的插件在什么条件执行, "nativeMessaging" 代表要在这个插件中同意调用这样的方法

"xxx"填入你想要的加载的网址

"content_scripts" 中"xxx" 表示在什么网页下执行我们与界面交互的script.

再来看看后台文件

background.js

var port = null;
chrome.runtime.onMessage.addListener(
  function(request, sender, sendResponse) {
     if (request.type == "launch"){
       	connectToNativeHost(request.message);
    }
	return true;
});

//onNativeDisconnect
function onDisconnected()
{
	console.log(chrome.runtime.lastError);
	console.log('disconnected from native app.');
	port = null;
}

function onNativeMessage(message) {
	console.log('recieved message from native app: ' + JSON.stringify(message));
}

//connect to native host and get the communicatetion port
function connectToNativeHost(msg)
{
	var nativeHostName = "com.my_company.my_application";
	console.log(nativeHostName);
 	port = chrome.runtime.connectNative(nativeHostName);
	port.onMessage.addListener(onNativeMessage);
	port.onDisconnect.addListener(onDisconnected);
	port.postMessage({message: msg});
 } 

在这个文件中有两个方法很重要

chrome.runtime.onMessage.addListener

connectToNativeHost

先来看第一个方法。

是一个响应事件。当接收到类型为"launch"的消息时, 调用 connectToNativeHost方法并传入数据。

com.my_company.my_application

这个是我们之后须要注冊在Regestry和Native Messaging里面的名字 之后会讲到。

runtime.connectNative这种方法连接我们的Native Messaging然后利用 postMessage 去发送我们要的信息给我们的本地应用

当然这里我们能够替换为 sendNativeMessage 直接给本地应用传值详见

https://developer.chrome.com/extensions/runtime#method-connectNative

我们在来看看ContentScript: content.js这个文件

 

<span style="font-family:SimSun;"><span style="font-size:18px;">var launch_message;
document.addEventListener('myCustomEvent', function(evt) {
chrome.runtime.sendMessage({type: "launch", message: evt.detail}, function(response) {
  console.log(response)
});
}, false);</span><strong>
</strong></span>

非常easy, 响应了一个页面中的事件"myCustomEvent", 同一时候公布一个消息给我们的后台文件background.js,这个消息包括了消息标示 "launch" 和 我们要传的值 evt.detail

关于Content Script 的信息 详见 https://developer.chrome.com/extensions/content_scripts

到这里我们的google插件部分就做好了

别忘了在Chrome 插件里开启开发人员模式 并载入这个插件

-------------------------------------切割线-------------------------------------

我们在来看看 Native Messaging 部分 我们再建一个 json 文件 我这里也叫做manifest.json(名字能够不是这个) 存在了我本地C:/Native文件夹下

<span style="font-family:SimSun;font-size:18px;">{
	"name": "com.my_company.my_application",
	"description": "Chrome sent message to native app.",
	"path": "C:\\MyApp.exe",
	"type": "stdio",
	"allowed_origins": [
		"chrome-extension://ohmdeifpmliljjdkaehaojmiafihbbdd/"
	]
}</span>

这里我们定义了 Native Messaging 的名字, 在path中定义了我们要执行的本地应用程序, allowed_origins 中长串的字符是我们插件的id 能够在安装插件后从google chrome 插件里看到(安装插件 能够在chrome中插件开启开发人员模式并加载我们之前的插件文件包)

完毕这步以后我们须要在WIndows 注冊表 中增加google 项目详细例如以下:

执行-> Regedit -> HKEY_Current_User->Software->Google->Chrome->新建一个叫NativeMessagingHosts的项->新建一个叫com.my_company.my_application的项,  同一时候在这个项里默认值设置为我们Native Messaging
的 位置 C:\\Native\\manifest.json

这样我们就完毕了NativeMessaging的设置

-------------------------------------我是切割线-------------------------------------

我们再来看看这个插件怎样和我们的站点交互

先建一个简单的网页内容例如以下

<span style="font-family:SimSun;font-size:18px;"><!DOCTYPE HTML>

<html>
<head>
<script>
function startApp() {
	var evt = document.createEvent("CustomEvent");
	evt.initCustomEvent('myCustomEvent', true, false, "im information");
	// fire the event
	document.dispatchEvent(evt);
}

</script>
</head>
<body>

<button type="button" onClick="startApp()" id="startApp">startApp</button>
</body>
</html>
</span>

里面有一个简单的button, 这个button会启动方法, 新建一个名叫"myCustomEvent"的事件, 同一时候附带有我们要传的信息, 并公布这个事件。 这样我们插件中的Content.js 就能够接收并响应这个事件了!

-------------------------------------我是切割线-------------------------------------

我们最后再来看看C#程序, 随便做一个很easy的程序, 放到了

C://MyApp.exe这里

在Main里面 我们能够增加以下这种方法, 利用Console.OpenStandardInput这个 我们能够接收到由页面传到我们应用的值并进行我们想要的一些操作, 在这里我们用一个log4net 记录我们程序执行情况

[assembly: log4net.Config.XmlConfigurator(Watch = true)]
namespace MyApp
{
    static class Program
    {
        public static log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
        [STAThread]
        static void Main(string[] args)
        {

            if (args.Length != 0)
            {
                string chromeMessage = OpenStandardStreamIn();
                log.Info("--------------------My application starts with Chrome Extension message: " + chromeMessage + "---------------------------------");
	        }
	    }

        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;
        }
    }
}

点击我们在页面上增加的button, 然后检查log文件:

2014-07-30 09:23:14,562 [1] INFO  MyApp.Program ----------------------------------------My application starts with Chrome Extension message: {"message":"im information"}---------------------------------

最后一张图总结下整个过程

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvTmljb2xhc18wMDg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" >

假设想要在安装我们本地软件时安装这个插件, 我们须要把我们的插件先公布到Chrome web store上详见https://developer.chrome.com/extensions/external_extensions

我将不赘述

版权声明:本文博客原创文章。博客,未经同意,不得转载。

时间: 2024-10-22 12:06:22

Chrome 小工具: 启动本地应用 (Native messaging)的相关文章

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

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

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

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

Chrome浏览器扩展开发系列之十四:本地消息机制Native messaging

通过将浏览器所在客户端的本地应用注册为Chrome浏览器扩展的“本地消息主机(native messaging host)”,Chrome浏览器扩展还可以与客户端本地应用之间收发消息. 客户端的本地应用注册为Chrome浏览器扩展的“本地消息主机”之后,Chrome浏览器会在独立的进程中启动该本地应用,并通过标准输入/输出流(stdin/stdout)进行消息通信. 1)      本地应用的配置文件的内容 本地应用要能够成为“本地消息主机”,必须有一个manifest.json配置文件(文件名

实现chrome扩展启动本地进程 - 补充

实现chrome扩展启动本地进程 - 补充 标签: chrome扩展启动本地程序访问本地磁盘 2014-10-17 11:42 6753人阅读 评论(17) 收藏 举报  分类: Chrome Plugin 版权声明:本文为博主原创文章,未经博主允许不得转载. 示例 主要包含如下部分 com.google.chrome.demo-win.json native_cmd.bat manifest.json popup.html popup.js 功能简介: 实现一个扩展,用户点击一个按钮后会启动本

Chrome 开发者工具的六个小技巧

下面是特邀Umar Hansa做的一篇文章.Umar有一个新闻组,我是他的粉丝,他很亲切地应我们要求把这篇约稿写成了新闻组的形式.我将让他介绍一下他自己. 嘿,我是Umar.我喜欢在Twitter(@umaar)上分享web开发相关的小技巧,同时也喜欢通过Dev Tips以gif的形式分享开发的小技巧.Dev Tips是开发者的一个新闻组.现在,它主要是Chrome开发工具相关的内容.开始之前,感谢CSS-Tricks给我机会为自己喜欢的一个组织做点贡献. 这篇文章将涵盖Chrome开发工具的六

【提高工作效率】快速启动小工具

一.工作中经常会遇到为找一个文件,盯着电脑图标,或双击文件夹查找很久的情况,经常遇到这样的事情,所消耗的时间累计也是挺多的.为了避免这类情况,能不能有一个软件能够快速去定位到我们需要打开的文件?答案当然是 ‘有’. 二.Everything. AltRun等软件都是为快速定位文件而生的小工具. Everything 这是目前速度最快的文件名搜索工具,侧重于搜索,在全盘搜索领域可谓一流. AltRun 是一款以最少键盘操作,最快启动文件为目标的快速启动工具,侧重于快捷键的集中管理和便捷.人性化的操

switchhosts(本地域名解析)小工具使用

switchhosts快速切换本地域名的小工具,一键切换hosts配置. 绿色版免安装,这样的话我们就不需要每次去找hosts文件去修改host了,轻松添加和删除本地主机上的域名解析表. 访问网站时,输入的域名先会在本地的域名解析表中查找,找到则直接按照该条目对应的IP访问,若没有则访问公网域名解析DNS服务器. 方便修改本地域名解析,使用域名跳转IP,便于记忆. 10.10.86.200 gitlab.oa.com 10.10.86.221 javawork.local 10.10.86.10

python的实战:一个目录一键启动管理小工具

简单的学习了几天的python,总觉得最好根据自身的需求来做点小工具实战一下. 上班的时候由于有很多目录需要打开.每次都要一个个的找那些目录.我觉得,我需要一个小工具.然后登记下,所有需要打开的目录.然后可以很方便的一键打开所有的目录或者是有哪些文件.然后登记一下.可以一次性打开所有登记的目标每次打开工具时,需要读取xml的数据.每增加一条数据要写入到xml中.这样我们即使部使用辅助工具去添加记录.直接修改xml文件的数据来增加记录也是可以的.具体实现如下 import os import xm

【开源一个小工具】一键将网页内容推送到Kindle

最近工作上稍微闲点,这一周利用下班时间写了一个小工具,其实功能挺简单但也小折腾了会. 工具名称:Simple Send to Kindle Github地址:https://github.com/zhanjindong/SimpleSendToKindle 功能:Windows下一个简单的将网页内容推送到Kindle的工具. 写这个工具的是满足自己的需求.自从买了Kindle paperwhite 2,它就成了我使用率最高的一个电子设备.相信很多Kindle拥有者和我一样都有这样一个需求:就是白