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は各ウィンドウが持っています。