BrowserWindow
ブラウザウィンドウを作成したり、制御したりします。
プロセス: Main
app
モジュールの ready
イベントが発生するまでは、このモジュールは使用できません。
// メインプロセス
const { BrowserWindow } = require('electron')
const win = new BrowserWindow({ width: 800, height: 600 })
// 外部 URL を読み込む
win.loadURL('https://github.com')
// またはローカルの HTML ファイルを読み込む
win.loadURL('index.html')
ウインドウのカスタマイズ
BrowserWindow
クラスは、アプリのウインドウの見た目や動作を変更するさまざまな方法を提供しています。 詳細は、ウインドウのカスタマイズ のチュートリアルをご覧ください。
ウインドウを違和感なく表示する
ウインドウにページを直接ロードすると、ユーザにはページが徐々にロードされるように見えるかもしれません。これはネイティブアプリとしては良い挙動ではありません。 ちらつかせることなくウインドウを表示するには、さまざまな状況に応じた 2 つの解決策があります。
ready-to-show
イベントを使用する
ページのロード中、ウインドウがまだ表示されていない場合、レンダラープロセスが初めてページをレンダリングし終わったとき、ready-to-show
イベントが発生します。 このイベントの後にウインドウを表示させれば、チラつくことはありません。
const { BrowserWindow } = require('electron')
const win = new BrowserWindow({ show: false })
win.once('ready-to-show', () => {
win.show()
})
このイベントは、通常、did-finish-load
イベントの後に発生しますが、大量のリモートリソースがあるページでは、did-finish-load
イベントの前に発生する可能性があります。
このイベントを使用すると、show
が false でもレンダラーが "見えている" と見なされ、描画されることに注意してください。 paintWhenInitiallyHidden: false
を使用すると、このイベントは発生しません。
backgroundColor
プロパティを設定する
複雑なアプリでは、ready-to-show
イベントが発生するのに時間がかかり過ぎて、アプリが遅いと感じさせる可能性があります。 このような場合、ウインドウをすぐに表示し、アプリの背景に近い backgroundColor
を 使うことを推奨します。
const { BrowserWindow } = require('electron')
const win = new BrowserWindow({ backgroundColor: '#2e2c29' })
win.loadURL('https://github.com')
ready-to-show
イベントを使用しているアプリに対しても、アプリがよりネイティブに感じられるように backgroundColor
を設定することが推奨されます。
いくつか有効な backgroundColor
の例を示します。
const win = new BrowserWindow()
win.setBackgroundColor('hsl(230, 100%, 50%)')
win.setBackgroundColor('rgb(255, 145, 145)')
win.setBackgroundColor('#ff00a3')
win.setBackgroundColor('blueviolet')
これらの色の種類についての詳細は、win.setBackgroundColor の有効なオプションをご参照ください。
親ウィンドウと子ウィンドウ
parent
オプションを使用することで、子ウインドウを作成することができます。
const { BrowserWindow } = require('electron')
const top = new BrowserWindow()
const child = new BrowserWindow({ parent: top })
child.show()
top.show()
child
ウインドウは、常に top
ウインドウの前面に表示されます。
モー ダルウィンドウ
モーダルウインドウは、親ウインドウを無効にする子ウインドウです。 モーダルウインドウを作成するには、parent
と modal
の両方のオプションを設定しなければなりません。
const { BrowserWindow } = require('electron')
const top = new BrowserWindow()
const child = new BrowserWindow({ parent: top, modal: true, show: false })
child.loadURL('https://github.com')
child.once('ready-to-show', () => {
child.show()
})
ページの表示状態
Page Visibility API は、以下のように動作します。
- すべてのプラットフォームおいて、表示状態はウインドウが非表示/最小化されているかどうかをトラッキングします。
- さらに、macOSでは、表示状態はウインドウが重なり合った状態もトラッキングします。 ウインドウが別のウインドウと重なり合った (例えば、完全に覆い隠された) 場合、表示状態は、
hidden
になります。 他のプラットフォーム上では、ウインドウが最小化されるか、明示的にwin.hide()
で非表示にされた場合のみ、表示状態はhidden
になります。 BrowserWindow
がshow: false
で作成された場合、ウインドウが実際には非表示であるにも関わらず、初期の表示状態はvisible
になります。backgroundThrottling
が無効の場合、ウインドウを最小化したり、重ねたり、非表示にしたりしても、表示状態はvisible
のままになります。
消費電力を最小にするために、 表示状態が hidden
のとき、高負荷な操作を一時停止することを推奨します。
プラットフォームに関する注意事項
- macOSでは、モーダルウインドウは親ウインドウに付随したシートとして表示されます。
- 親ウインドウが移動したとき、macOSでは、子ウインドウは親ウインドウに対する相対的な位置を維持しますが、WindowsとLinuxでは、子ウインドウは移動しません。
- Linuxでは、モーダルウインドウの型は、
dialog
に変更されます。 - Linuxでは、多くのデスクトップ環境は、モーダルウインドウを非表示にすることをサポートしていません。
クラス: BrowserWindow extends BaseWindow
ブラウザウィンドウを作成したり、制御したりします。
プロセス: Main
BrowserWindow
は EventEmitter を継承しています。
options
によって設定されたネイティブプロパティで新しい BrowserWindow
を生成します。
new BrowserWindow([options])
インスタンスイベント
new BrowserWindow
で作成されたオブジェクトでは以下のイベントが発生します。
注: いくつかのイベントは特定のオペレーティングシステムでのみ利用可能で、そのように注記がつけられています。
イベント: 'page-title-updated'
戻り値:
event
Eventtitle
stringexplicitSet
boolean
ドキュメントのタイトルが変更されたときに発生します。event.preventDefault()
を呼び出すことで、ネイティブウインドウのタイトルが変更されるのをキャンセルできます。 タイトルがファイルの URL から合成された場合、explicitSet
は false です。
イベント: 'close'
戻り値:
event
Event
ウインドウがクローズされようとするときに発生します。 これは、DOMの beforeunload
と unload
イベントの前に発生します。 event.preventDefault()
を呼び出すことで、クローズがキャンセルされます。
通常、ウインドウをクローズさせる必要があるかどうかを判断するために、beforeunload
ハンドラーを使用したいと思うでしょうが、これは、ウインドウがリロードされるときにも呼び出されます。 Electronでは、undefined
以外の値を返却すれば、クローズをキャンセルします。 以下がその例です。
window.onbeforeunload = (e) => {
console.log('I do not want to be closed')
// メッセージボックスがユーザに表示される通常のブラウザーとは違って、
// 無効でない値を返却すれば、何も表示せずにクローズをキャンセルします。
// アプリケーションがクローズするのをユーザに確認させるには、
// ダイアログAPIを使用することを推奨します。
e.returnValue = false
}
注意: window.onbeforeunload = handler
と window.addEventListener('beforeunload', handler)
の動作には、微妙な違いがあります。 値のみを返すのではなく、常に明示的に event.returnValue
を設定するようにすることを推奨します。後者の方がElectron内でより一貫性のある動作をします。
イベント: 'closed'
ウインドウが閉じられたときに発生します。 このイベントを受け取った後は、ウインドウへの参照を削除し、以降そのウインドウを使用しないようにしてください。
イベント: 'session-end' Windows
強制的なシャットダウン、マシン再起動またはセッションのログオフによってウインドウセッションが終了されようとしたときに発生します。
イベント: 'unresponsive'
Webページが応答しなくなるときに発生します。
イベント: 'responsive'
応答しないWebページが再び応答するようになるときに発生します。
イベント: 'blur'
ウインドウがフォーカスを失うときに発生します。
イベント: 'focus'
ウインドウがフォーカスを得るときに発生します。
イベント: 'show'
ウインドウが表示されるときに発生します。
イベント: 'hide'
ウインドウが非表示になるときに発生します。
イベント: 'ready-to-show'
Webページが (まだ表示されていないが) レンダリングされ、チラつくことなくウインドウが表示できるときに発生します。
このイベントを使用すると、show
が false でもレンダラーが "見えている" と見なされ、描画されることに注意してください。 paintWhenInitiallyHidden: false
を使用すると、このイベントは発生しません。
イベント: 'maximize'
ウィンドウが最大化されるときに発生します。
イベント: 'unmaximize'
ウインドウが最大化状態から抜けるときに発生します。
イベント: 'minimize'
ウィンドウが最小化されるときに発生します。
イベント: 'restore'
ウインドウが最小化状態から復元されたときに発生します。
イベント: 'will-resize' macOS Windows
戻り値:
event
EventnewBounds
Rectangle - ウインドウがリサイズされようとしているサイズ。details
Objectedge
(string) - サイズ変更のためにドラッグされているウインドウの縁。bottom
、left
、right
、top-left
、top-right
、bottom-left
、bottom-right
のいずれかになります。
ウィンドウがリサイズされる前に発生します。 event.preventDefault()
を呼び出すことで、ウィンドウがリサイズされるのを阻止できます。
このイベントは、ウィンドウが手動でリサイズされようとしているときにしか発生しません。 ウィンドウを、setBounds
やsetSize
でリサイズする時には、このイベントは発生しません。
edge
オプションに設定できる値と動作は、プラットフォーム依存です。 以下は取りうる値です。
- Windows では、有効な値は
bottom
、top
、left
、right
、top-left
、top-right
、bottom-left
、bottom-right
です。 - macOS では、有効な値は
bottom
、right
です。- 値
bottom
は垂直方向のサイズ変更の 表現に使用されます。 - 値
right
は水平方向のサイズ変更の表現に使用されます。
- 値
イベント: 'resize'
ウインドウがリサイズされた後に発生します。
イベント: 'resized' macOS Windows
ウインドウがリサイズされるときに一度発生します。
これは、通常、ウィンドウが手動でリサイズされようとしているときにしか発生しません。 macOS の場合 setBounds
/setSize
でウィンドウのサイズを変更し、 animate
パラメーターを true
に設定すると、サイズ変更が完了したときにも、このイベントが発生します。
イベント: 'will-move' macOS Windows
戻り値:
event
EventnewBounds
Rectangle - ウインドウが移動されようとしている位置。
ウィンドウが移動される前に発生します。 Windows では、 event.preventDefault()
を呼び出すことで、ウィンドウが移動されるのを阻止できます。
このイベントは、ウィンドウが手動で移動されようとしているときにしか発生しません。 ウインドウを setPosition
/setBounds
/center
で移動する時には、このイベントは発生しません。
イベント: 'move'
ウインドウが新しい位置に移動されているときに発生します。
イベント: 'moved' macOS Windows
ウインドウが新しい位置に移動されるときに一回だけ、発生します。
注: macOSでは、このイベントは move
のエイリアスです。
イベント: 'enter-full-screen'
ウインドウがフルスクリーン状態に入るときに発生します。
イベント: 'leave-full-screen'
ウインドウがフルスクリーン状態を抜けるときに発生します。
イベント: 'enter-html-full-screen'
ウインドウがHTML APIによってフルスクリーン状態に入るときに発生します。
イベント: 'leave-html-full-screen'
ウインドウがHTML APIによってフルスクリーン状態を抜けるときに発生します。
イベント: 'always-on-top-changed'
戻り値:
event
EventisAlwaysOnTop
boolean
ウインドウが常に他のウインドウの手前に表示されるように設定またはそれが解除されたときに発生します。
イベント: 'app-command' Windows Linux
戻り値:
event
Eventcommand
string
アプリコマンド が呼び出されるときに発生します。 これらは、Windowsで幾つかのマウスに組み込まれている "Back" ボタンだけでなく、一般的にキーボードのメディアキーやブラウザコマンドとも関連付けられています。
コマンドは小文字にされ、アンダースコアはハイフンに置き換えられ、APPCOMMAND_
プレフィックスは外されます。 例えば、APPCOMMAND_BROWSER_BACKWARD
は、browser-backward
として送信されます。
const { BrowserWindow } = require('electron')
const win = new BrowserWindow()
win.on('app-command', (e, cmd) => {
// ユーザーがマウスで戻るボタンを押下したときにナビゲートする
if (cmd === 'browser-backward' && win.webContents.canGoBack()) {
win.webContents.goBack()
}
})
Linux 上では以下のアプリコマンドが明示的にサポートされます。
browser-backward
browser-forward
イベント: 'swipe' macOS
戻り値:
event
Eventdirection
string
3 本指でのスワイプ時に発生します。 方向は up
、right
、down
、left
のいずれかになります。
このイベントは、スワイプで画面の内容が移動しない、古い macOS スタイルのトラックパッドスワイプを元にしています。 ほとんどの macOS トラックパッドはもうこの類のスワイプを許可していないため、正常にイベントを発生させるためには システム環境設定 > トラックパッド > その他のジェスチャ
の 'ページ間をスワイプ' 設定を '2本指または3本指でスワイプ' にする必要があります。
イベント: 'rotate-gesture' macOS
戻り値:
event
Eventrotation
Float
トラックパッドの回転ジェスチャで発生します。 回転ジェスチャーが終了するまで継続的に発生します。 各イベントの rotation
値は、最後の発生から回転した角度です。 回転ジェスチャで最後に発行されたイベントは、常に 0
の値になります。 反時計回りの回転値は正であり、時計回りの回転値は負です。
イベント: 'sheet-begin' macOS
ウインドウがシートを開くときに発生します。
イベント: 'sheet-end' macOS
ウインドウがシートを閉じたときに発生します。