single.php

Chrome 拡張機能のNative Message機能で外部アプリを引数付きで起動する

Google Chromeの拡張機能には Native Message 機能で外部プロセスの実行が可能です。今回はC#アプリを作成して引数付きでメモ帳などのアプリを起動する方法を紹介します。

Native Messageでパラメータを受け渡し

Chrome 拡張機能では外部のプログラムを実行できる Native Message 機能を利用が利用できます。

先回、Chrome拡張機能のアイコンをクリックしたイベントでパラメータの受け渡しをする手順を紹介していきます。

詳しい内容は別記事をご覧ください。

今回は、同じ機能をVC++で作成できるコンソールアプリで行う方法を紹介します。

C#アプリで値を返却する

C#のコンソールプロジェクトを作成して、次のコードを追加して、Chrome 拡張機能からJSON形式で、アプリ名と引数の値を受信します。

using System.Windows.Forms;
using System.Text.Json;
using static System.Windows.Forms.VisualStyles.VisualStyleElement.ToolTip;
using System.Text;
using static System.Runtime.InteropServices.JavaScript.JSType;
using System;
using System.Diagnostics;

// See https://aka.ms/new-console-template for more information
//Console.WriteLine("Hello, World!");

string data = GetData();
Dictionary<string, string> dict = JsonSerializer.Deserialize<Dictionary<string, string>>(data);

string appName = "";
string appArgs = "";

foreach (string key in dict.Keys)
{
    if (key == "app")
    {
        appName = dict[key];
    }

    if (key == "args")
    {
        appArgs = dict[key];
    }

}

if (appName != "")
{
    var app = new ProcessStartInfo();
    app.FileName = appName;

    if (appArgs != "")
    {
        app.Arguments = appArgs;
    }

    app.UseShellExecute = true;
    Process.Start(app);
}


Result res = new Result();
res.Message = "Hello";

string jsonString = JsonSerializer.Serialize(res);
MessageBox.Show(jsonString);
SetData(jsonString);

static void SetData(string Data)
{
    byte[] bytes = BitConverter.GetBytes(Data.Length);
    Stream openstdout = Console.OpenStandardOutput();
    for (int i = 0; i < 4; i++)
    {
        openstdout.WriteByte(bytes[i]);
    }
    byte[] b = Encoding.UTF8.GetBytes(Data);
    openstdout.Write(b, 0, b.Length);
    openstdout.Flush();
    openstdout.Close();
}

static string GetData()
{
    var openstdinput = Console.OpenStandardInput();
    var length = 0;
    var lengthBytes = new byte[4];
    openstdinput.Read(lengthBytes, 0, 4);
    length = BitConverter.ToInt32(lengthBytes, 0);

    string result = "";
    for (int i = 0; i < length; i++)
    {
        result += (char)openstdinput.ReadByte();
    }
    openstdinput.Close();
    return result;
}

public class Result
{
    public string? Message { get; set; }
}

Chrome 拡張機能側の[background.js]を編集して、C#で作成した外部プロセスにファイル名(”notepad”)と引数(”C:\…\sample,txt”)を送信します。

'use strict';
{
  chrome.action.onClicked.addListener((tab) => {

    try {

      chrome.runtime.sendNativeMessage(
        'native.message.sample',
        {app:'notepad', args:'C:\\..\\sample.txt'},
        errorHandle(function(response, thread){
          console.log(response);
          return true;
        }
      ));

    } catch (error) {
        console.log(error.response);
    }
  });
}

function errorHandle(process) {
  return function(){
    try {
      return process.apply(this, arguments);
    } catch (e) {
      console.error(e);
    }
  };
}

プロジェクトをビルドして、Chrome 拡張機能を実行するとJSON形式で指定したテキストファイルが[メモ帳]で表示されます。

まとめ

今回は、短い記事になりますが、Google Chromeの拡張機能の Native Message 機能でC#で作成した外部プログラムを利用して引数付きで起動する手順について紹介しました。

C#で中継するアプリを作成する手間がありますが、NativeMessageを利用して別アプリケーションを引数付きで起動が可能です。

Google Chrome 拡張機能で、別のアプリケーションを引数付きで起動したい人の参考になれば幸いです。

スポンサーリンク

最後までご覧いただきありがとうございます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です