本文へ移動
hanzochang

技術と実践のノート

ChromeExtension(拡張機能)の開発でショートカットを実装する

公開

著者:株式会社hanzochang

この記事ではChrome Extension(拡張機能)のManifest v3の開発で、ショートカット機能をどう実装するかを知ることができます。

はじめに

Chrome Extension(拡張機能)はキーボードショートカットを使った制御を実装できます。 この記事では、その手法を知ることができます。

想定読者
  • Chrome Extensionでアプリを開発している人
  • Manifest v3で実装中
  • ショートカットをつかった拡張機能の開発をしたい人
前提知識
  • Chrome Extensionの開発の基本構造を理解している。
    • manifest.json
    • service_worker
    • content_script

2通りの実装方法

実装方法は2通りあります。

実装方法1.

「ポップアップを起動するだけのショートカットをつくる」... ActionCommandsで実装

実装方法2.

「キーボード入力に応じて、ServiceWorkerでハンドリングする」... Basic Commandsで実装

【実装方法1】ポップアップを起動するだけのショートカットをつくる

最もシンプルなパターンです。ポップアップの起動のためのショートカットをつくります。この実装はAction commandsと呼びます。

やり方はとても簡単です。

manifest.jsonに記述

manifest.json に commands を追加し _execute_action を定義します。

仮に Ctrl+Shift+0 というコマンドを登録する場合下記になります。

text
{
  (略)
  "commands": {
    "_execute_action": {
      "suggested_key": {
        "windows": "Ctrl+Shift+0",
        "mac": "Command+Shift+0",
        "chromeos": "Ctrl+Shift+0",
        "linux": "Ctrl+Shift+0"
      }
    }
  }
  (略)
}

text
{
  (略)
  "commands": {
    "_execute_action": {
      "suggested_key": {
        "windows": "Ctrl+Shift+0",
        "mac": "Command+Shift+0",
        "chromeos": "Ctrl+Shift+0",
        "linux": "Ctrl+Shift+0"
      }
    }
  }
  (略)
}

記法の制約があるので、最後に説明します。

manifest.jsonを記述したら、chrome://extensions/のリロードボタンを押して再読み込みをしましょう。再読み込みをしないと反映されませんので注意です。

chrome://extensions/この方法で実装すると、ショートカット押下でアプリを起動させることができます。

アプリ起動にフックして、何かアクションをしたい場合等はこの実装で十分です。それ以上の機能を実装したい場合は、この手段だと不十分です。次に説明する「実装方法2」で実装していきましょう。

【実装方法2】起動時のショートカットをアサインする。

manifest.jsonに記述

この実装はBasic Commandsと呼びます。

manifest.json に commands を追加し 任意の名前のオブジェクト を定義します。

仮に Ctrl+Shift+1 というコマンドを登録する場合下記になります。

text
{
  (略)
  "commands": {
   "runSomething": { // ショートカット名
      "suggested_key": {
        "default": "Ctrl+Shift+1",
        "mac": "Command+Shift+1"
      },
      "description": "Run something"// ショートカットの説明文
    }
  }
  (略)
}

text
{
  (略)
  "commands": {
   "runSomething": { // ショートカット名
      "suggested_key": {
        "default": "Ctrl+Shift+1",
        "mac": "Command+Shift+1"
      },
      "description": "Run something"// ショートカットの説明文
    }
  }
  (略)
}

manifest.jsonを記述したら、拡張機能の再読み込みをしましょう。(再読み込みをしないと反省されません)

この実装だけだと Ctrl+Shift+1 を入力しても、何も反応がありません。

Basic Commandsの場合は制御を自前実装する必要があります。

実装は ServiceWorker に記述します。

ServiceWorkerに記述
text
chrome.commands.onCommand.addListener((command) => {
  switch (command) {
    case "runSomething": // 設定したショートカット名
      // やりたい処理を記述
      break;
  }
});

text
chrome.commands.onCommand.addListener((command) => {
  switch (command) {
    case "runSomething": // 設定したショートカット名
      // やりたい処理を記述
      break;
  }
});

と、こんな感じでやりたい処理を記述すればOKです。

実装が完了したら、拡張機能の再読み込みをお忘れなく。

Chromeのショートカット実装の留意点と細かな情報

登録されたショートカットは下記で確認できます。

chrome://extensions/shortcuts にアクセスすると利用中の拡張機能のショートカット登録状況を閲覧できます。

chrome://extensions/shortcutsショートカットが他のchrome拡張機能と衝突していた場合、登録されません。その状況を対策したい場合は、下記の処理を実装する必要があります。

ショートカットが衝突した時

これらのショートカットは、インストール時に登録されます。登録されなかった場合、下記の実装でハンドリングできます。厳密にショートカットのハンドリングをしたい場合は実装を検討しましょう。

ほぼ公式ガイドの引用です。

公式ガイド

text
// ServiceWorker.js
chrome.runtime.onInstalled.addListener((reason) => {
if (reason === chrome.runtime.OnInstalledReason.INSTALL) {
checkCommandShortcuts();
}
});

function checkCommandShortcuts() {
chrome.commands.getAll((commands) => {
let missingShortcuts = [];

    for (let {name, shortcut} of commands) {
      if (shortcut === '') {
        missingShortcuts.push(name);
      }
    }

    if (missingShortcuts.length > 0) {
      // もしショートカットが登録されなかった場合のハンドリングをここに書く
    }

});
}

text
// ServiceWorker.js
chrome.runtime.onInstalled.addListener((reason) => {
if (reason === chrome.runtime.OnInstalledReason.INSTALL) {
checkCommandShortcuts();
}
});

function checkCommandShortcuts() {
chrome.commands.getAll((commands) => {
let missingShortcuts = [];

    for (let {name, shortcut} of commands) {
      if (shortcut === '') {
        missingShortcuts.push(name);
      }
    }

    if (missingShortcuts.length > 0) {
      // もしショートカットが登録されなかった場合のハンドリングをここに書く
    }

});
}

「もしショートカットが登録されなかった場合のハンドリングをここに書く」の箇所に、ハンドリングの実装を書きます。

ショートカット登録できなかった旨をユーザーに伝えるために、「content_script.jsにメッセージを送信して、トーストを表示する」とか「chrome.stroageにフラグを格納しておいて、popupやinstall直後のページで表示する」などの処理パターンが考えられます。

使用できるキーの制約

ショートカット登録にあたって制約もあります。正確には公式 https://developer.chrome.com/docs/extensions/reference/commands/#key-combinations を読んでいただきたいですが、ざっくりサマると下記です。

https://developer.chrome.com/docs/extensions/reference/commands/#key-combinations- Ctrl(macは⌘) または Alt を必ずショートカットに含める必要があります。 Ctrl(macは⌘) または Alt を必ずショートカットに含める必要があります。

  • メディアキーは使えない(fnなど。未確認。)
  • Shift キーは使えます。
  • OSやChromeで実装されているショートカットキーは上書きできません。
DGGR Bookmarkのご紹介

今回の記事で記述したやり方で、拡張機能を作っています。 ショートカット実装の、サンプルとしてもご覧いただけます。

👇 ショートカット押下で、すぐ起動する、の例(伝わりづらい....)

DGGR(ディガー) Bookmarkといいます。

軽くて早いのが特徴のブックマークツールです。

競合サイトリストや参考サイトリストをまとめる作業を楽にします。 参考サイトの抽出は、ノートパッドにURLをコピーするなどしてまとめているかと思いますが、それを楽にするためのツールです。 フィードバックをいただけますと幸いです!

DGGR Bookmark | サービス調査を高速にするブックマーク

DGGR Bookmark | サービス調査を高速にするブックマーク🙏pc・macでchromeをお使いの方のみご利用可能です🙏

拡張機能開発の相談はこちら

拡張機能の開発も承っております。 Hubspot等のSaaSによく見られる、既存のWebシステムと連携した拡張機能の他、社内の作業工数を楽にするDXのための拡張機能などなど承っております。 よろしければご相談ください。

お問い合わせフォーム

お問い合わせフォーム

この記事を書いた人

Webプランナー、開発会社の創業メンバーを経て、Fintech・DX・Web3の企画・開発に従事。2021年に独立し、2023年に株式会社hanzochangを設立。現在はAIを活用した業務改善と、自社サービス「指定管理者制度AI」の開発・運用に取り組んでいます。

半澤勇大のXアカウント(新しいタブで開く)

この記事の株式会社hanzochangについて
少し紹介させてください!

この記事に関連する当社のサービス

業務改善・AI活用支援

転記・集計・資料作成にかかる時間を減らしませんか?

現在の業務と使っているシステムを整理し、AIが役立つ作業から改善します。試作で効果を確かめ、現場で使うアプリの開発・運用まで支援します。

サービスの詳細を見る
Jくんが多様な業務アプリを開発するイラスト。背景に多数のアプリが並ぶ。
  • 業務の整理

    手間のかかる作業と、改善する順番を明確に。

  • 試作・アプリ開発

    実際の手順に合わせて、使える仕組みを開発。

  • 導入・運用支援

    使い方の共有から、導入後の改善まで対応。

業務改善・AI活用について、お気軽にご相談ください。