[Electron] メニュー「アプリについて」をカスタマイズする

  • このエントリーをはてなブックマークに追加
  • LINEで送る

メニューからWindowsなら「ヘルプ」→「(アプリ名)について」、macOSなら「(アプリ名)」→「(アプリ名)について」とたどるとアプリのバージョン情報や製作者名が表示される機能をElectronではAboutPanelと呼びます。

今回はこのAboutPanelの表示内容をカスタマイズします。

- Sponsored Link -

AboutPanelのデフォルト表示

前者がWindows、後者がmacOSのデフォルト表示です。Windowsは味気なく、macOSに至ってはElectronのアイコンが表示されちゃってます。これを自分好みに変えていきます。

AboutPanelをカスタマイズ

まずはデフォルトの内容を単純に書き換える方法です。

アイコン画像の準備

今回利用するアイコン画像は画像サイズ32×32か48×48、画像形式はJPEGかPNGで用意します。透過PNGを利用すると背景が透けてキレイに表示できます。

アイコン画像が準備できたら今回はasset/image/icon.pngにファイルを置きました。elecron-builderなどでビルドする際にはpackage.jsonへ追記するのをお忘れなく。

ソースコード

メニュー全体のコードは過去記事をご覧ください。

上記のコードからの変更点は6〜18行目です。app.setAboutPanelOptions()を追加しているだけです。

const { app, Menu, BrowserWindow } = require('electron');

// 実行環境がmacOSならtrue
const isMac = (process.platform === 'darwin');  // 'darwin' === macOS

//------------------------------------
// About Panelの内容をカスタマイズする
//------------------------------------
app.setAboutPanelOptions({
    applicationName: '俺のアプリ',                // アプリ名
    applicationVersion: 'v1.0.0',              // アプリのバージョン
    copyright: 'Copyright (C) 2020 M.Katsube', // コピーライト
    version: 'build20201223',                  // ビルドバージョン (macOS用) 
    credits: 'Special Thanks xxxxx',           // クレジット (Windows,macOS用)
    authors: ['M.Katsube'],                    // 作者名 (Linux用)
    website: 'https://blog.katsubemakito.net/' // URL (Linux用)
    iconPath: 'asset/image/icon.png'           // アイコン画像 (Linux,Windows用)
});

//------------------------------------
// メニュー
//------------------------------------
// メニューを準備する
const template = Menu.buildFromTemplate([
  ...(isMac ? [{
      label: app.name,
      submenu: [
        {role:'about', label:`${app.name}について` },
        // 中略
      ]
   }] : []),

  // 中略

  {
    label:'ヘルプ',
    submenu: [
      {label:`${app.name} ヘルプ`},    // ToDo
      ...(isMac ? [ ] : [
        {type:'separator'} ,
        {role:'about', label:`${app.name}について` }
      ])
    ]
  }
]);

// メニューを適用する
Menu.setApplicationMenu(template);


//------------------------------------
// ウィンドウ
//------------------------------------
// 初期化が終了したらウィンドウを新規に作成する
app.whenReady().then(()=>{
   const win = new BrowserWindow({
    width: 1024,
    height: 800,
    webPreferences: {
      nodeIntegration: true,
    }
  })
  win.loadFile('public/index.html')
})

// 以下略

Windowsの実行結果

アプリを起動したら「ヘルプ」→「(アプリ名)について」とたどります。

以下のように表示されました。LinuxとmacOSのみの項目は表示されていませんがそれっぽくなってますね。

macOSの実行結果

アプリを起動したら「(アプリ名)」→「(アプリ名)について」とたどります。

こちらもWindowsとLinuxのみの項目は表示されませんが、アイコンがElecronのまま…。AboutPanel自体はそれほど重要な部分では無いのですがさすがにこれは看過できないですねw

AboutPanelを独自の処理に置き換える

app.setAboutPanelOptions()で手軽に変更できるのは良いのですが、環境によって表示される内容が違いすぎるし、macOSでアイコンがデフォルトのままなのはさすがにちょっと…といった場合には自前で用意してあげます。

今回はElectronのダイアログの機能で代用することにしました。

ソースコード

上記のコードから変更した行の背景色を変えています。

const { app, Menu, dialog, BrowserWindow } = require('electron');
const {resolve} = require('path');

// 実行環境がmacOSならtrue
const isMac = (process.platform === 'darwin');  // 'darwin' === macOS

//------------------------------------
// About Panelの内容をカスタマイズする
//------------------------------------
const aboutPanel = function(){
  dialog.showMessageBox({
    title: `${app.name}について`,
    message: `${app.name} ${app.getVersion()}`,
    detail: `Created by M.Katsube\nCopyright (C) 2020 M.katsube.`,
    buttons: [],
    icon: resolve(__dirname, 'asset/image/icon.png')
  });
}


//------------------------------------
// メニュー
//------------------------------------
// メニューを準備する
const template = Menu.buildFromTemplate([
  ...(isMac ? [{
      label: app.name,
      submenu: [
        {label:`${app.name}について`, click:aboutPanel},
        // 中略
      ]
   }] : []),

  // 中略

  {
    label:'ヘルプ',
    submenu: [
      {label:`${app.name} ヘルプ`},    // ToDo
      ...(isMac ? [ ] : [
        {type:'separator'} ,
        {label:`${app.name}について`, click:aboutPanel}
      ])
    ]
  }
]);

// メニューを適用する
Menu.setApplicationMenu(template);


//------------------------------------
// ウィンドウ
//------------------------------------
// 初期化が終了したらウィンドウを新規に作成する
app.whenReady().then(()=>{
   const win = new BrowserWindow({
    width: 1024,
    height: 800,
    webPreferences: {
      nodeIntegration: true,
    }
  })
  win.loadFile('public/index.html')
})

// 以下略

Windowsの実行結果

Windowsの方は先ほどとそれほど変わらないですね。

macOSの実行結果

macOSの方は今度は無事にアイコン画像も表示されました。

参考ページ

このブログを応援する

お寄せいただいたお気持ちは全額サーバ代や次の記事を執筆するための原資として活用させていただいております。この記事が参考になった場合などぜひご検討ください。

PayPal(ペイパル)
PayPalで300円支払う
※金額は任意で変更できます。
※100円でも泣いて喜びますw
※住所の入力欄が現れた場合は「no needed」を選択ください
これまでのご協力者さま
- Sponsored Link -