single.php

Chrome 拡張機能のNative Message機能でC#アプリに値を受け渡す方法

Google Chromeの拡張機能には Native Message 機能で外部プロセスに値を受け渡す方法を備忘録的に投稿しておきます。

Native Messageで外部プログラムを実行

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

先回、C#のコンソールアプリを自作して Chrome拡張機能のアイコンをクリックしたイベントで実行させるための手順を紹介していきます。

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

外部プログラムに値を受け渡す

先回は単純に外部プログラムを実行しましたが、今回はパラメータの受け渡しを行っていきます。

様々な方法が考えられますが、今回は “chrome.runtime.sendNativeMessage” を利用してパラメータをJSON形式で送信して、外部プログラムで表示する手順を紹介します。

先回作成した[NativeMessage]拡張機能を修整してパラメータの受け渡しができるようにします。

1. 必要なファイルとフォルダーを作成しておきます。(拡張子が無いのはフォルダー)

[NativeMessage]
|-[icons]
| |-[icon-48.png]
| |-[icon-128.png]
|-[manifest.json]
|-[background.js]

2.[background.js]を編集して次のJSONコードに修整して保存します。

'use strict';
{
  chrome.action.onClicked.addListener((tab) => {
     //chrome.runtime.connectNative('native.message.sample');
     chrome.runtime.sendNativeMessage(
      'native.message.sample',
      {param1:'Hello', param2:'World'}
    );
  });

}

sendNativeMessage” では、第2引数で指定した値が外部プログラムに送信されます。

今回はJSON形式で “param1” と “param2” の値を送信しています。

3. C#アプリの “Program.cs” の先頭にJSON形式を解析するためのアセンブリ “System.Text.JSON” を追加します。

using System.Text.Json;

4. “Program.cs” の末尾に、送られてきた文字列を読み込むためのGetData関数を追加します。

static string GetData()
{
    var openstdinput = Console.OpenStandardInput();
    if (openstdinput == System.IO.Stream.Null)
    {
        return "";
    }

    var length = 0;

    var lengthBytes = new byte[4];
    openstdinput.Read(lengthBytes, 0, 4);
    length = BitConverter.ToInt32(lengthBytes, 0);

    var buffer = new char[length];
    using (var reader = new StreamReader(openstdinput))
    {
        reader.Read(buffer, 0, buffer.Length);
    }
    return new string(buffer);
}

5. “Program.cs” の処理を変更して読み込んだ文字列を解析する処理を追加します。

[System.Text.Json]アセンブリで、JSON形式からDictionary形式に変換してメッセージボックスで表示します。

string data = GetData();
Dictionary<string, string> dict = JsonSerializer.Deserialize<Dictionary<string, string>>(data);
foreach (string key in dict.Keys)
{
    MessageBox.Show("名前: " + key + " 値: " + dict[key]);
}

6. Google Chromeで[拡張機能]ページを開いて、再読み込みを行います。

7. Chromeの拡張機能のボタンをクリックすると、パラメータ付きで外部プログラムが実行され次のメッセージが表示されます。

8.[OK]をクリックすると別パラメータが表示されます。

“Program.cs” のすべてのコードは、こんな感じになります。

using System.Windows.Forms;
using System.Text.Json;

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

string data = GetData();
Dictionary<string, string> dict = JsonSerializer.Deserialize<Dictionary<string, string>>(data);
foreach (string key in dict.Keys)
{
    MessageBox.Show("名前: " + key + " 値: " + dict[key]);
}

static string GetData()
{
    var openstdinput = Console.OpenStandardInput();
    if (openstdinput == System.IO.Stream.Null)
    {
        return "";
    }

    var length = 0;

    var lengthBytes = new byte[4];
    openstdinput.Read(lengthBytes, 0, 4);
    length = BitConverter.ToInt32(lengthBytes, 0);

    var buffer = new char[length];
    using (var reader = new StreamReader(openstdinput))
    {
        reader.Read(buffer, 0, buffer.Length);
    }
    return new string(buffer);
}

Google Chromeから実行する際に[Invalid native messaging host name specified]エラーになる場合には、別記事をご覧ください。

まとめ

今回は、Google Chromeの拡張機能で Native Message 機能で外部プロセスにパラメータを受け渡して実行させるまでの手順について紹介しました。

NativeMessageを利用するとC#などで作成した別アプリケーションをChrome拡張機能から実行できます。

その際に “chrome.runtime.sendNativeMessage” を利用して値を受け渡して実行ができます。

Google Chrome 拡張機能で、別のアプリケーションを実行する際に値を受け渡しをしたい人の参考になれば幸いです。

スポンサーリンク

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

コメントを残す

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