01 chrome Native messaging

Native messaging 扩展解决chrome与本地程序通信的问题,可以解决从浏览器启动二进制文件的问题。
是通过扩展为browser进程发送信息,有browser进程启动二进制文件或者和指定的二进制文件通信。

下图参考自 Chrome Native Messaging技术示例

下面是chrome官方提供的扩展demo。
https://github.com/GoogleChrome/chrome-extensions-samples

nativeMessaging

02 具体操作步骤

02.01 保存demo代码

把 代码下载到 google的临时目录下,在 %localappdata%\Google\Chrome\User Data\Default\ 下创建一个Extensions2目录,将 nativeMessaging 放入。效果如下:

02.02 加载插件

[更多工具] --> [扩展程序] --> [开发者模式] --> [加载已解压的扩展程序] --> [选择 nativeMessaging\app 路径] --> [加载]

加载成功效果

02.03 注册host 信息

运行 nativeMessaging\host\install_host.bat
查看注册表信息,

实际是注册了如下注册表信息

REG ADD "HKCU\Software\Google\Chrome\NativeMessagingHosts\com.google.chrome.example.echo" /ve /t REG_SZ /d "%~dp0com.google.chrome.example.echo-win.json" /f

运行的内容是 native-messaging-example-host.bat

这里如果在该bat文件中加入需要运行的exe,既可以执行对应的exe,或者直接把bat换成想要运行的其他可执行程序。

@echo off
:: Copyright (c) 2013 The Chromium Authors. All rights reserved.
:: Use of this source code is governed by a BSD-style license that can be
:: found in the LICENSE file.python "%~dp0/native-messaging-example-host" %*

而真正运行的是 python脚本 native-messaging-example-host,所以电脑上应该配置好python运行环境。

#!/usr/bin/env python
# Copyright (c) 2012 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.# A simple native messaging host. Shows a Tkinter dialog with incoming messages
# that also allows to send message back to the webapp.import struct
import sys
import threading
import Queuetry:import Tkinterimport tkMessageBox
except ImportError:Tkinter = None# On Windows, the default I/O mode is O_TEXT. Set this to O_BINARY
# to avoid unwanted modifications of the input/output streams.
if sys.platform == "win32":import os, msvcrtmsvcrt.setmode(sys.stdin.fileno(), os.O_BINARY)msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)# Helper function that sends a message to the webapp.
def send_message(message):# Write message size.sys.stdout.write(struct.pack('I', len(message)))# Write the message itself.sys.stdout.write(message)sys.stdout.flush()# Thread that reads messages from the webapp.
def read_thread_func(queue):message_number = 0while 1:# Read the message length (first 4 bytes).text_length_bytes = sys.stdin.read(4)if len(text_length_bytes) == 0:if queue:queue.put(None)sys.exit(0)# Unpack message length as 4 byte integer.text_length = struct.unpack('i', text_length_bytes)[0]# Read the text (JSON object) of the message.text = sys.stdin.read(text_length).decode('utf-8')if queue:queue.put(text)else:# In headless mode just send an echo message back.send_message('{"echo": %s}' % text)if Tkinter:class NativeMessagingWindow(Tkinter.Frame):def __init__(self, queue):self.queue = queueTkinter.Frame.__init__(self)self.pack()self.text = Tkinter.Text(self)self.text.grid(row=0, column=0, padx=10, pady=10, columnspan=2)self.text.config(state=Tkinter.DISABLED, height=10, width=40)self.messageContent = Tkinter.StringVar()self.sendEntry = Tkinter.Entry(self, textvariable=self.messageContent)self.sendEntry.grid(row=1, column=0, padx=10, pady=10)self.sendButton = Tkinter.Button(self, text="Send", command=self.onSend)self.sendButton.grid(row=1, column=1, padx=10, pady=10)self.after(100, self.processMessages)def processMessages(self):while not self.queue.empty():message = self.queue.get_nowait()if message == None:self.quit()returnself.log("Received %s" % message)self.after(100, self.processMessages)def onSend(self):text = '{"text": "' + self.messageContent.get() + '"}'self.log('Sending %s' % text)try:send_message(text)except IOError:tkMessageBox.showinfo('Native Messaging Example','Failed to send message.')sys.exit(1)def log(self, message):self.text.config(state=Tkinter.NORMAL)self.text.insert(Tkinter.END, message + "\n")self.text.config(state=Tkinter.DISABLED)def Main():if not Tkinter:send_message('"Tkinter python module wasn\'t found. Running in headless ' +'mode. Please consider installing Tkinter."')read_thread_func(None)sys.exit(0)queue = Queue.Queue()main_window = NativeMessagingWindow(queue)main_window.master.title('Native Messaging Example')thread = threading.Thread(target=read_thread_func, args=(queue,))thread.daemon = Truethread.start()main_window.mainloop()sys.exit(0)if __name__ == '__main__':Main()

03 运行效果

这个扩展demo,可以直接使用命令行运行。chrome://apps 查找到插件,点击运行,效果如下:

或者直接地址栏输入 chrome-extension://knldjmfmopnpolahpmmgbagdohdnhkik/main.html

点击页面的 Connect 按钮,效果如下:

输入一些文字后,点击 Send 按钮的效果

04 Chromium的相关修改

如果是Chromium二次开发的浏览器,只需要加入自己对应的注册表键值即可

05 一些问题

这种方式启动的exe或者脚本,需要另外进行进程管理,chrome关闭时,并不能关闭启动的第三方进程。

如果要使用和chrome一样的进程名,可能需要一些周折。

如果是自己编译的进程好,可以考虑修改utility 及 subtype类型,来模糊第三方进程名称,但是,它依然不是chrome自己的进程,仍然需要自己管理这个特殊的进程。

06 参考

Chrome Native Messaging技术示例

nativeMessaging

Native Message 解决Chrome插件权限问题

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

chrome.runtime 调用本地程序

代理配置扩展

Google chrome浏览器中通过扩展调用本地应用程序以及和程序相互通讯(C++)

ChromeNativeMessaging 原生消息通信

Native Messaging

examples/api/nativeMessaging

07 使用c++ demo

把python程序换成c++ 代码,效果相同

// chrome_native_messaging_host.exe
// chromeHost.cpp
#include <iostream>
#include <string>
#include <fstream>
#include <Windows.h>using namespace std;void func()
{string message = "{\"text\": \"This is a response message\",\"num\": \"three\"}";unsigned int len = message.length();//先输出长度cout << char(((len >> 0) & 0xFF))<< char(((len >> 8) & 0xFF))<< char(((len >> 16) & 0xFF))<< char(((len >> 24) & 0xFF));//再输出内容并结束cout << message;cout.flush();
}int main(int argc, char* argv[]) {string input = "";while (1){Sleep(5 * 1000);func();}getline(cin, input);cout << "You entered: " << input << endl;ofstream myfile;myfile.open("example1.txt");myfile << "Writing this to a file.\n";myfile << input;myfile.close();system("pause");return 0;
}

修改 com.google.chrome.example.echo-win.json

// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.{"name": "com.google.chrome.example.echo","description": "Chrome Native Messaging API Example Host",//"path": "native-messaging-example-host.bat","path": "chrome_native_messaging_host.exe","type": "stdio","allowed_origins": ["chrome-extension://knldjmfmopnpolahpmmgbagdohdnhkik/"]
}

chromium 37 chrome Native messaging 本地消息机制相关推荐

  1. Google Chrome Native Messaging开发实录(一)背景介绍

    最近接手了一个针对Google Chrome的需求,最终是使用Native Messaging来实现的.通过这个连载,将把本次开发从方案选定到编码的全部过程进行完整的回顾,并记录开发过程中踩过的各种坑 ...

  2. 【安卓学习笔记】Android Handler 消息机制探究

    一.概述 1.android消息机制的含义: Android消息机制,其实指的就是 Handler 的运行机制,而 Handler 要正常运作,又需要底层的 MessageQueue , Looper ...

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

    转自:http://www.myexception.cn/internet/1729118.html 最近碰到了一个新问题,需要利用Chrome 的插件, 从我们的一个网站中启动一个我们的本地C#应用 ...

  4. 【Android 异步操作】Handler 机制 ( MessageQueue 消息队列的阻塞机制 | Java 层机制 | native 层阻塞机制 | native 层解除阻塞机制 )

    文章目录 一.MessageQueue 的 Java 层机制 二.MessageQueue 的 native 层阻塞机制 三.MessageQueue 的 native 层解除阻塞机制 三.Messa ...

  5. Handler消息机制-Native层

    Handler消息机制-Native层 android12-release Handler消息机制-FWK层 1. MessageQueue连接Native层 1.1 nativeInit初始化 Na ...

  6. Android Framework学习(八)之Handler消息机制(Native层)解析

    在深入解析Android中Handler消息机制一文中,我们学习了Handler消息机制的java层代码,这次我们来学习Handler消息机制的native层代码. 在Java层的消息处理机制中,Me ...

  7. 本地消息表实现机制讲解

    本地消息表(异步确保) 本地消息表这种实现方式应该是业界使用最多的,其核心思想是将分布式事务拆分成本地事务进行处理,这种思路是来源于ebay.我们可以从下面的流程图中看出其中的一些细节: 基本思路就是 ...

  8. iOS开发系列--通知与消息机制

    http://www.cocoachina.com/ios/20150318/11364.html 概述 在多数移动应用中任何时候都只能有一个应用程序处于活跃状态,如果其他应用此刻发生了一些用户感兴趣 ...

  9. EJB与JAVA BEAN_J2EE的异步消息机制

    EJB与JAVA BEAN_J2EE的异步消息机制 EJB与JAVA BEAN的区别 Java Bean 是可复用的组件,对Java Bean并没有严格的规范,理论上讲,任何一个Java类都可以是一个 ...

最新文章

  1. Hadoop SequenceFile数据结构介绍及读写
  2. linux 命令窍门,不容错过的Linux命令行窍门
  3. python3网络编程中semaphore用法_python3 进程信号量semaphore
  4. keil git 编译文件_keil下的STM32程序开发部署(一)
  5. linux 视频转gif,GitHub - alinuxsa/VideoToGIF: video to gif 视频转gif制作表情包插件(可以添加文字)...
  6. matlab stk 代码,STK与matlab互联,stkSetPropClassical报错
  7. oracle 修改数据表结构常用sql
  8. tornado post第3方_[33]python-Web-框架-Tornado
  9. 在双系统(Windows与Ubuntu)下删除Ubuntu启动项
  10. Django学习总结①
  11. latex : 系统找不到指定文件问题解决方案
  12. python基础代码大全-python文件及目录操作代码汇总
  13. 【设计篇】系统应该构建与使用分离
  14. MySQL新闻和新闻详情关联_新闻首页实现 -- 5. 新闻详情以及评论功能实现
  15. 树莓派安装TPLINK_WN725n v2网卡驱动
  16. 为串联机械臂写一个ROS控制器
  17. scrapy中文文档基础知识
  18. 数学 24个基本求导公式 常见导数公式 简介
  19. php实现室内地图导航,概述-室内地图 JS API | 高德地图API
  20. 电脑“开始-运行”的常用命令及用法!很有用!

热门文章

  1. 从“策略模式”聊聊“设计模式”有多重要?
  2. 让代码看起来更舒服,选择适合的字体。 (转)--我推荐的是:Bitstream Vera Sans Mono
  3. C# 打印文档(word文档)
  4. 数据预处理(四)——数据标准化
  5. JN516x串口测试
  6. 零基础学习OpenCL(1)-安装OpenCL
  7. 优先队列 HDU4544
  8. 什么是ANC主动降噪技术?
  9. Coursera TensorFlow 基础课程-week1
  10. bxSlider——一个精悍的拥有一大波焦点图轮播滑动特效的Js程序