開発

ElectronでRenderer Processから立ち上げたBrowserWindowを閉じる方法

Electronで新しいウィンドウを立ち上げる場合、通常BrowserWindowを使うわけです(hrefで新しいウィンドウを呼べたりできますがここでは対象外)がRenderer Processから直接呼ぶことが出来ません。ですのでremoteなどでMain Process経由で呼ぶ必要があります。

sample1

const electron = require('electron')
const remote = electron.remote
const BrowserWindow = remote.BrowserWindow

const newWin = new BrowserWindow ({ width: 300, height: 200})

通常はこれで困らないのですがプログラム側でこのウィンドウを閉じる場合ハマりました。
例えばFramelessなウィンドウを作った場合、閉じるボタンがないので自前で閉じる処理をする必要がありますがこんな感じの処理で閉じようとすると閉じてくれません。

sample2

// フォーカスが外れたらウィンドウを閉じる
onBlur = () => {
  newWin.close()
}

コマンドは実行されているみたいですがウィンドウは残ったままになってしまいます。
これをちゃんと閉じるには、BrowserWindowのスタティックメソッドを使う必要があります。

sample3

const electron = require('electron')
const remote = electron.remote
const BrowserWindow = remote.BrowserWindow

// クリックで新しいウィンドウオープン
onClick = (url) => {
  let newWin = new BrowserWindow ({ width: 300, height: 200, frame: false })
  newWin.loadURL(url)

  // フォーカスが外れたらウィンドウを閉じる
  newWin.on('blur', () => {
    BrowserWindow.fromId(newWin.id).close()
    newWin = null
  })

}

BrowserWindow.fromId でウィンドウIDを指定してBrowserWindow.closeで閉じてあげればちゃんと閉じてくれます。
ウィンドウIDは各ウィンドウが持っています。

管理人

Recent Posts

CanvaがSerif (Affinity) を買収

私は使ったことがないのですが名前はよく聞…

3週間 ago

Serifのスプリングセール – アドオンが50%オフ

Affinity Photoなどレタッチ…

2か月 ago

音声がロボットのようになるときの対処

リモート会議などでたまに相手の音声がおか…

3か月 ago

Serifのブラックフライデー – 全品40%オフ V1ユーザは更にお得!

恒例のブラックフライデーセールが始まりま…

5か月 ago

[rust] rayonで書き直してみました

前回のコードを元にrayonを使った処理…

5か月 ago

[rust] async-stdで書き直してみました

前回のコードをasync-stdで書き直…

6か月 ago