# BrowserWindow
> 創建并控制瀏覽器窗口。
```javascript
// 主進程中
const {BrowserWindow} = require('electron')
// 或者在渲染進程中使用 `remote`
// const {BrowserWindow} = require('electron').remote
let win = new BrowserWindow({width: 800, height: 600})
win.on('closed', () => {
win = null
})
// 載入一個遠程 URL
win.loadURL('https://github.com')
// 或者載入本地 HTML 文件
win.loadURL(`file://${__dirname}/app/index.html`)
```
## 無框架窗口
要創建一個沒有 chrome,或者一個任意形狀的透明窗口,可以使用 [Frameless Window](frameless-window.md) API。
## 優雅的顯示窗口
當直接在一個窗口中載入一個頁面,用戶將看到一個加載頁面的進度條,對于原生應用這并不是一個好的體驗。要讓窗口不顯示視覺效果,對于不同的情況有兩種方案。
### 使用 `ready-to-show` 事件
載入頁面時, `ready-to-show` 事件會在渲染進程已經完成首次繪制時被發送,在這個事件之后顯示窗口,就不會看到視覺效果:
```javascript
const {BrowserWindow} = require('electron')
let win = new BrowserWindow({show: false})
win.once('ready-to-show', () => {
win.show()
})
```
這個事件通常在 `did-finish-load` 事件之后發送,但是對于有太多遠程資源的頁面,也有可能在 `did-finish-load` 事件之前發送。
### 設置 `backgroundColor`
對于一個復雜的應用, `ready-to-show` 事件可能很晚才被發送,使應用感覺很慢。這種情況,建議立即顯示窗口,并使用一個接近應用背景的 `backgroundColor` :
```javascript
const {BrowserWindow} = require('electron')
let win = new BrowserWindow({backgroundColor: '#2e2c29'})
win.loadURL('https://github.com')
```
注意,即使使用了 `ready-to-show` 事件的應用,仍然建議設置 `backgroundColor` 以使應用感覺更接近原生。
## 父和子窗口
通過使用 `parent` 選項,可以創建子窗口:
```javascript
const {BrowserWindow} = require('electron')
let top = new BrowserWindow()
let child = new BrowserWindow({parent: top})
child.show()
top.show()
```
`child` 窗口總是顯示在 `top` 窗口上方。
### 模態窗口
模態窗口是一個禁用了父窗口的子窗口,要創建一個模態差un港口,必須設置 `parent` 和 `modal` 選項:
```javascript
const {BrowserWindow} = require('electron')
let child = new BrowserWindow({parent: top, modal: true, show: false})
child.loadURL('https://github.com')
child.once('ready-to-show', () => {
child.show()
})
```
### 平臺注意事項
* 在 macOS 上,當父窗口移動時,子窗口會保持相對于父窗口的位置;而在 Windows 和 Linux 上,子窗口不會移動。
* 在 Windows 上,不支持動態改變父窗口。
* 在 Linux 上,模態窗口的 類型被改變為 `dialog`。
* 在 Linux 上的許多桌面環境不支持隱藏一個模態窗口。
## Class: BrowserWindow
`BrowserWindow` 是一個 [EventEmitter](http://nodejs.org/api/events.html#events_class_events_eventemitter)。
它使用通過 `options` 設置的原生屬性創建一個新 `BrowserWindow` 。
### `new BrowserWindow([options])`
* `options` Object
* `width` Integer —— 窗口的像素寬度。默認為 `800`。
* `height` Integer —— 窗口的像素高度。默認為 `600`。
* `x` Integer (**必須** 如果 y 被使用) —— 窗口相對屏幕的左偏移。默認顯示在窗口中央。
* `y` Integer (**必須** 如果 x 被使用) —— 窗口相對屏幕的頂部偏移。默認顯示在窗口中央。
* `useContentSize` Boolean —— `width` 和 `height` 將被用作 web 頁面大小 ,也就是說實際的窗口大小會包含窗口 frame 的大小并且可能略大。默認為 `false`。
* `center` Boolean —— 在屏幕中央顯示窗口。
* `minWidth` Integer —— 窗口的最小寬度。默認為 `0`。
* `minHeight` Integer —— 窗口的最小高度。默認為 `0`。
* `maxWidth` Integer —— 窗口的最大寬度。默認沒有限制。
* `maxHeight` Integer —— 窗口的最大高度。默認沒有限制。
* `resizable` Boolean —— 窗口是否能重設大小。默認為 `true`。
* `movable` Boolean —— 窗口是否可以移動。在 Linux 上沒有被實現。默認為 `true`。
* `minimizable` Boolean —— 窗口是否可以最小化。在 Linux 上沒有被實現。默認為 `true`。
* `maximizable` Boolean —— 窗口是否可以最大化。在 Linux 上沒有被實現。默認為 `true`。
* `closable` Boolean —— 窗口是否可關閉。在 Linux 上沒有被實現。默認為 `true`。
* `focusable` Boolean —— 窗口是否可以獲得焦點。默認為 `true`。在 Windows 上設置 `focusable: false` 也暗指設置 `skipTaskbar: true`。在 Linux 上設置 `focusable: false` 使窗口停止和 wm 交互,所以窗口會已知停留在所有工作控件的上面。
* `alwaysOnTop` Boolean —— 窗口是否應該一直停留在其它窗口上方。默認為 `false`。
* `fullscreen` Boolean —— 窗口是否以全屏方式顯示。當明確設置為 `false` ,在 macOS 上全屏按鈕被會隱藏或禁用。默認為 `false`。
* `fullscreenable` Boolean —— 窗口是否可以進入全屏模式。在 macOS 上,不管最大化/縮放按鈕都可以切換全屏模式或者最大化窗口。默認為 `true`。
* `skipTaskbar` Boolean —— 是否在任務欄中顯示窗口。默認為 `false`。
* `kiosk` Boolean —— kiosk 模式。默認為 `false`。
* `title` String —— 默認的窗口標題。默認為 `"Electron"`。
* `icon` [NativeImage](native-image.md) —— 窗口 icon 。在 Windows 上建議使用 `ICO` icons 來獲得最好的視覺效果,也可以留為 undefined 將使用可執行程序的 icon 。
* `show` Boolean —— 當窗口創建后是否可以顯示。默認為 `true`。
* `frame` Boolean —— 指定為 `false` 來創建一個 [無框架](frameless-window.md)窗口。默認為 `true`。
* `parent` BrowserWindow —— 指定父窗口。默認為 `null`。
* `modal` Boolean —— 是否是一個模態窗口。只有窗口是子窗口的時候才能工作。默認為 `false`。
* `acceptFirstMouse` Boolean —— web 視圖是否接受一個獨立的 mouse-down 同時激活窗口的事件默認為 `false`。
* `disableAutoHideCursor` Boolean —— 當輸入時是否隱藏游標。默認為 `false`。
* `autoHideMenuBar` Boolean —— 自動隱藏菜單欄,除非 `Alt` 鍵被按下。默認為 `false`。
* `enableLargerThanScreen` Boolean —— 開啟窗口可以被設置大于屏幕大小。默認為 `false`。
* `backgroundColor` String —— 十六進制值的窗口背景色,如 `#66CD00` 或 `#FFF` 或 `#80FFFFFF` (支持透明通道)。默認為 `#FFF` (白色)。
* `hasShadow` Boolean —— 窗口是否有陰影。只在 macOS 上實現了。默認為 `true`。
* `darkTheme` Boolean —— 強制為窗口使用 dark 主題,只在一些 GTK+3 桌面環境上工作。默認為 `false`。
* `transparent` Boolean —— 使窗口 [透明](frameless-window.md)。默認為 `false`。
* `type` String —— 窗口類型,默認為一般窗口。在下面會看到更多相關信息。
* `titleBarStyle` String —— 窗口的標題欄樣式。默認為 `default`。可能的值為:
* `default` —— 生成一個標準的灰色不透明的 Mac 標題欄。
* `hidden` —— 生成到一個隱藏的標題欄和一個全窗口的內容窗口,但是標題欄仍然保留了標準的窗口控制器("traffic lights")在左上方。
* `hidden-inset` - 生成到一個隱藏的標題欄,另外的外觀,traffic light 按鈕輕微從窗口邊緣插入。
* `thickFrame` Boolean —— 在 Windows 上為無框架窗口使用 `WS_THICKFRAME` 樣式,即擴大標準的窗口框架。設置為 `false` 將移除窗口陰影和窗口動畫。默認為 `true`。
* `webPreferences` Object —— web 頁面的功能設置。
* `devTools` Boolean —— 是否啟用開發者工具。如果設置為 `false`,不能使用 `BrowserWindow.webContents.openDevTools()` 打開開發者工具。默認為 `true`。
* `nodeIntegration` Boolean —— 是否啟用 node 集成。默認為 `true`。
* `preload` String —— 指定一個會在這個頁面中運行的腳本之前加載的腳本。這個腳本一直有權限訪問 node APIs 無論是否打開或者關閉了 node 集成。這個值可以是一個腳本的絕對文件路徑。當 node 集成被關閉時,preload 腳本可以恢復 Node 的全局符號回到全局作用域。查看 [示例](process.md#event-loaded)。
* `session` [Session](session.md#class-session) —— 設置頁面使用的 session 。你可以選擇使用 `partition` 選項,即接受一個 partition 字符串,來替代直接傳遞 Session 對象。當 `session` 和 `partition` 都被提供, `session` 是優先的。默認是默認的 session。
* `partition` String —— 柑橘 session 的 partition 字符串設置頁面使用的 session 。如果 `partition` 以 `persist:` 開頭,頁面會使用一個持久的 session,在 app 中帶有相同 `partition` 的頁面都可用。如果沒有 `persist:` 前綴,頁面會使用一個內存中的 session 。通過賦值相同的 `partition`,多個頁面可以共享同樣的 session。默認為默認的 session 。
* `zoomFactor` Number —— 頁面默認的縮放因子, `3.0` 表示 `300%`。默認為 `1.0`。
* `javascript` Boolean —— 啟用 JavaScript 支持。默認為 `true`。
* `webSecurity` Boolean —— 當為 `false` 時,將禁用同源策略(通常被用來測試站點),并且如果 `allowDisplayingInsecureContent` 和 `allowRunningInsecureContent` 這兩個選項還未被用戶設定,會將其設置 為 `true` 。默認為 `true`。
* `allowDisplayingInsecureContent` Boolean —— 允許一個 https 頁面顯示從 http URLs 而來的如圖片內容。默認為 `false`。
* `allowRunningInsecureContent` Boolean —— 允許一個 https 頁面運行 JavaScript, CSS 或著由 http URLs 而來的插件。默認為 `false`。
* `images` Boolean —— 啟用圖片支持。默認為 `true`。
* `textAreasAreResizable` Boolean —— 使 textarea 元素可以被重設大小。默認為 `true`。
* `webgl` Boolean —— 啟用 WebGL 支持。默認為 `true`。
* `webaudio` Boolean —— 啟用 WebAudio 支持。默認為 `true`。
* `plugins` Boolean —— 插件是否可以被啟用。默認為 `false`。
* `experimentalFeatures` Boolean —— 啟用 Chromium 的實驗性功能。默認為 `false`。
* `experimentalCanvasFeatures` Boolean —— 啟用 Chromium 的試驗性 canvas 功能。默認為 `false`。
* `scrollBounce` Boolean —— 在 macOS 上啟用滾動回彈(橡皮筋)效果 。默認為 `false`。
* `blinkFeatures` String —— 一個特性的字符串列表,通過 `,` 分隔,像 `CSSVariables,KeyboardEventKey` 來啟用它們。 支持特性字符串的完整列表可以在 [RuntimeEnabledFeatures.in][blink-feature-string] 文件中找到。
* `disableBlinkFeatures` String —— 一個特性字符串的列表,通過 `,` 分隔,像 `CSSVariables,KeyboardEventKey` 來禁用它們。支持的特性字符串的完整列表可以在 [RuntimeEnabledFeatures.in][blink-feature-string] 文件中找到。
* `defaultFontFamily` Object —— 設置默認的字體
* `standard` String —— 默認為 `Times New Roman`。
* `serif` String —— 默認為 `Times New Roman`。
* `sansSerif` String —— 默認為 `Arial`。
* `monospace` String —— 默認為 `Courier New`。
* `defaultFontSize` Integer —— 默認為 `16`。
* `defaultMonospaceFontSize` Integer —— 默認為 `13`。
* `minimumFontSize` Integer —— 默認為 `0`。
* `defaultEncoding` String —— 默認為 `ISO-8859-1`。
* `backgroundThrottling` Boolean —— 當頁面成為背景時是否遏制動畫和計時器。默認為 `true`。
* `offscreen` Boolean —— 是否為瀏覽器窗口開啟離屏渲染。默認為 `false`。
* `sandbox` Boolean —— 是否啟用 Chromium OS級的沙盒。
當使用 `minWidth`/`maxWidth`/ `minHeight`/`maxHeight` 設置窗口的最小/最大寬高度,它只能約束用戶。不能阻止你傳遞一個不遵照大小約束的值到 `setBounds`/`setSize` 或到 `BrowserWindow` 的構造函數中。
`type` 選項可能的值和行為根據平臺而定。
可能的值有:
* 在 Linux 上,可能的類型為 `desktop`, `dock`, `toolbar`, `splash`, `notification`。
* 在 macOS 上,可能的類型為 `desktop`, `textured`。
* `textured` 類型增加金屬梯度外觀(`NSTexturedBackgroundWindowMask`)。
* `desktop` 類型將窗口置于桌面背景窗口級別(`kCGDesktopWindowLevel - 1`)。注意,桌面窗口不接受焦點、鍵盤或者鼠標事件,但是可以使用 `globalShortcut` 來接收保守的輸入。
* 在 Windows 上,可能的類型為 `toolbar`。
### 實例事件
`new BrowserWindow` 創建的對象發送如下事件:
**注意:** 一些事件只在特定操作系統下有效,會對它們進行標記。
#### Event: 'page-title-updated'
返回:
* `event` Event
* `title` String
當文檔改變了標題后發生,調用 `event.preventDefault()` 將阻止原生窗口標題的改變。
#### Event: 'close'
返回:
* `event` Event
當窗口將要被關閉時發生。發生在 DOM 的 `beforeunload` 和 `unload` 事件之前。調用 `event.preventDefault()`
將取消關閉。
通常你可能想要使用 `beforeunload` 處理程序來決定窗口是否應該被關閉,它在窗口被重新載入時也會被調用。在 Electron 中,返回任何值而不是 `undefined` 將會取消關閉。例如:
```javascript
window.onbeforeunload = (e) => {
console.log('I do not want to be closed')
// 不像一般瀏覽器一個消息框會被提示給用戶,返回
// 一個 非 void 的值會靜靜的取消關閉。
// 建議使用 dialog API 來使用戶確認關閉應用
e.returnValue = false
}
```
#### Event: 'closed'
當窗口被關閉后發射。在你接受到這個事件之后,應該移除對窗口的引用避免使用它。
#### Event: 'unresponsive'
當 web 頁面變成無響應時發生。
#### Event: 'responsive'
當無響應頁面重新響應時發生。
#### Event: 'blur'
當窗口失去焦點時發生。
#### Event: 'focus'
當窗口獲得焦點時發生。
#### Event: 'show'
當窗口被顯示時發生。
#### Event: 'hide'
當窗口被隱藏時發生。
#### Event: 'ready-to-show'
當 web 頁面已經被渲染,而且窗口可以被顯示為沒有可視載入中效果時發生。
#### Event: 'maximize'
當窗口被最大化時發生。
#### Event: 'unmaximize'
當窗口從最大化退出時發生。
#### Event: 'minimize'
當窗口被最小化時發生。
#### Event: 'restore'
當窗口從一個最小化狀態恢復時發生。
#### Event: 'resize'
當窗口被重設大小時發生。
#### Event: 'move'
當窗口被移動到一個新的位置時發生。
__注意__: 在 macOS 上這個事件只是 `moved` 事件的一個別名。
#### Event: 'moved' _macOS_
當窗口被移動到一個新位置時發生一次。
#### Event: 'enter-full-screen'
當窗口進入全屏狀態時發生。
#### Event: 'leave-full-screen'
當窗口離開全屏狀態時發生。
#### Event: 'enter-html-full-screen'
當窗口被 HTML API 觸發進入一個全屏狀態時發生。
#### Event: 'leave-html-full-screen'
當窗口離開由 HTML API 觸發的全屏時發生。
#### Event: 'app-command' _Windows_
返回:
* `event` Event
* `command` String
當一個 [App Command](https://msdn.microsoft.com/en-us/library/windows/desktop/ms646275(v=vs.85).aspx) 被調用時發生。通常是相關鍵盤媒體鍵或者瀏覽器命令,也包括 Windows 上一些鼠標的 "Back" 鍵。
命令是小寫的,下劃線被連接符取代,而且 `APPCOMMAND_` 前綴被剝去。例如 `APPCOMMAND_BROWSER_BACKWARD` 被發送為 `browser-backward`。
```javascript
const {BrowserWindow} = require('electron')
let win = new BrowserWindow()
win.on('app-command', (e, cmd) => {
// 當用戶點擊它們的鼠標后退按鈕,導航窗口后退
if (cmd === 'browser-backward' && win.webContents.canGoBack()) {
win.webContents.goBack()
}
})
```
#### Event: 'scroll-touch-begin' _macOS_
當滾動滾輪事件階段開始時發生。
#### Event: 'scroll-touch-end' _macOS_
當滾動滾輪事件結束時發生。
#### Event: 'scroll-touch-edge' _macOS_
當滾動滾輪階段到達元素邊緣時發生。
#### Event: 'swipe' _macOS_
返回:
* `event` Event
* `direction` String
3指滑動發生。可能的 `directions` 為 `up`, `right`, `down`, `left`。
### 靜態方法
`BrowserWindow` 類有以下靜態方法:
#### `BrowserWindow.getAllWindows()`
返回 `BrowserWindow[]` —— 所有打開的瀏覽器窗口的一個數組。
#### `BrowserWindow.getFocusedWindow()`
返回 `BrowserWindow` —— 應用中獲得了焦點的窗口,否則返回 `null`。
#### `BrowserWindow.fromWebContents(webContents)`
* `webContents` [WebContents](web-contents.md)
返回 `BrowserWindow` —— 擁有指定 `webContents` 的窗口。
#### `BrowserWindow.fromId(id)`
* `id` Integer
返回 `BrowserWindow` —— 指定 `id` 的窗口。
#### `BrowserWindow.addDevToolsExtension(path)`
* `path` String
增加位于 `path` 的開發者工具擴展,返回擴展的名字。
擴展 將被記住,所以你只需要調用這個 API 一次,這個 API 不是用于編程。如果你試圖增加一個已經載入的擴展,這個方法沒有返回,而是記錄一個警告到控制臺。
如果擴展的 manifest 丟失或者錯誤,這個方法也不會返回。
**注意:** 在 `app` 模塊的 `ready` 事件發生之前這個 API 不能被調用。
#### `BrowserWindow.removeDevToolsExtension(name)`
* `name` String
通過名字移除一個開發者工具擴展。
**注意:** 這個 API 在 `app` 模塊的 `ready` 事件發生之前不能被調用。
#### `BrowserWindow.getDevToolsExtensions()`
返回 `Object` —— keys 是擴展的名稱,每個值都是一個對象,包括 `name` 和 `version` 屬性。
要檢查一個開發者工具擴展是否安裝,可以運行下面的腳本:
```javascript
const {BrowserWindow} = require('electron')
let installed = BrowserWindow.getDevToolsExtensions().hasOwnProperty('devtron')
console.log(installed)
```
**注意:** 這個 API 在 `app` 模塊的 `ready` 事件發生之前不能被調用。
### 實例屬性
通過 `new BrowserWindow` 創建的對象有如下屬性:
```javascript
const {BrowserWindow} = require('electron')
// In this example `win` is our instance
let win = new BrowserWindow({width: 800, height: 600})
win.loadURL('https://github.com')
```
#### `win.webContents`
一個當前窗口擁有的 `WebContents` 對象。所有 web 頁面相關的事件和操作都通過它進行。
查看 [`webContents` documentation](web-contents.md) 了解它的方法和事件。
#### `win.id`
一個 `Integer` ,代表這個窗口唯一的 ID 。
### 實例方法
使用 `new BrowserWindow` 創建的對象有以下實例方法:
**注意:** 一些方法只在特定操作系統有效,將對其進行標記。
#### `win.destroy()`
強制關閉窗口, `unload` 和 `beforeunload` 事件都不會被發送給 web 頁面, `close` 事件也不會向這個窗口發送,但是它擔保 `closed` 事件會被發送。
#### `win.close()`
嘗試關閉窗口。和用戶手動點擊窗口的關閉按鈕有同樣效果。web 頁面可以取消這個關閉。查看 [close event](#event-close)。
#### `win.focus()`
使窗口獲得焦點。
#### `win.blur()`
從這個窗口移除焦點。
#### `win.isFocused()`
返回 `Boolean` —— 窗口是否被聚焦。
#### `win.isDestroyed()`
返回 `Boolean` —— 窗口是否被銷毀。
#### `win.show()`
顯示并給予窗口焦點。
#### `win.showInactive()`
顯示窗口但是不會給予焦點。
#### `win.hide()`
隱藏窗口。
#### `win.isVisible()`
返回 `Boolean` —— 窗口是否對用戶可見。
#### `win.isModal()`
返回 `Boolean` —— 當前窗口是否是一個模態窗口。
#### `win.maximize()`
最大化窗口。
#### `win.unmaximize()`
取消窗口最大化。
#### `win.isMaximized()`
返回 `Boolean` —— 窗口是否最大化。
#### `win.minimize()`
最小化窗口。在一些平臺上最小化窗口會被顯示到 Dock 。
#### `win.restore()`
從最小化狀態恢復窗口到前一個狀態。
#### `win.isMinimized()`
返回 `Boolean` —— 窗口是否最小化。
#### `win.setFullScreen(flag)`
* `flag` Boolean
設置窗口是否可以進入全屏模式。
#### `win.isFullScreen()`
返回 `Boolean` —— 窗口是否在全屏模式。
#### `win.setAspectRatio(aspectRatio[, extraSize])` _macOS_
* `aspectRatio` Float —— 對于一些內容視圖部分要維持的寬高比。
* `extraSize` Object (可選) —— 當維持寬高比時不包括的大小。
* `width` Integer
* `height` Integer
這使一個窗口維持一個寬高比。額外的大小 `extraSize` 允許開發者使用像素指定間隔,不包括在寬高比的計算中。這個 API 已經考慮了窗口大小和它的內容大小的差別。
考慮一個普通窗口中帶有一個 HD 視頻播放器和相關的控制區域。或者有在左側邊緣有 15像素的 控制區域,右側邊緣有25像素的控制區域,播放器之下也有 50 像素的控制區域。為了在播放器自身中維持一個 16:9 寬高比(HD @1920x1080 的標準寬高比)我們可以調用這個函數,參數為 16/9 和 [ 40, 50 ]。第二個參數不關心哪里是內容視圖中額外的寬度和高度 —— 只有它們存在。 只匯總任何已經在整個內容視圖中的額外寬度和高度區域。
#### `win.previewFile(path[, displayName])` _macOS_
* `path` String —— 要使用 QuickLook 預覽的文件的絕對路徑。因為 Quick Look 使用路徑上的文件名和擴展名來決定要打開文件的類型,所以這很重要。
* `displayName` String (可選) —— 要在 Quick Look 模態視圖中顯示的文件的名稱。這只是純粹的顯示,并不影響文件的內容類型。默認為 `path`。
使用 [Quick Look][quick-look] 來預覽指定 path 的一個文件。
#### `win.setBounds(bounds[, animate])`
* `bounds` [Rectangle](structures/rectangle.md)
* `animate` Boolean (可選)_macOS_
重設大小并移動窗口到提供的邊界。
#### `win.getBounds()`
返回 [`Rectangle`](structures/rectangle.md)
#### `win.setContentBounds(bounds[, animate])`
* `bounds` [Rectangle](structures/rectangle.md)
* `animate` Boolean (可選) _macOS_
重設大小并移動窗口的客戶端區域(例如 web 頁面)到提供的邊界。
#### `win.getContentBounds()`
返回 [`Rectangle`](structures/rectangle.md)
#### `win.setSize(width, height[, animate])`
* `width` Integer
* `height` Integer
* `animate` Boolean (可選) _macOS_
重設窗口大小為 `width` `height`。
#### `win.getSize()`
返回 `Integer[]` —— 包含窗口的 width 和 height 。
#### `win.setContentSize(width, height[, animate])`
* `width` Integer
* `height` Integer
* `animate` Boolean (可選) _macOS_
重設窗口的客戶端區域(如 web 頁面)大小到 `width` 和 `height`。
#### `win.getContentSize()`
返回 `Integer[]` —— 包括窗口的客戶端區域的 width 和 height。
#### `win.setMinimumSize(width, height)`
* `width` Integer
* `height` Integer
設置窗口的最小大小到 `width` 和 `height`。
#### `win.getMinimumSize()`
返回 `Integer[]` —— 包括窗口的最小的 width 和 height。
#### `win.setMaximumSize(width, height)`
* `width` Integer
* `height` Integer
設置窗口的最大 `width` 和 `height`。
#### `win.getMaximumSize()`
返回 `Integer[]` —— 包括窗口的最大 width 和 height。
#### `win.setResizable(resizable)`
* `resizable` Boolean
設置窗口是否可以被用戶手動重設大小。
#### `win.isResizable()`
返回 `Boolean` —— 窗口是否可以被用戶手動重設大小。
#### `win.setMovable(movable)` _macOS_ _Windows_
* `movable` Boolean
設置窗口是否可以被用戶移動。在 Linux 上什么也不做。
#### `win.isMovable()` _macOS_ _Windows_
返回 `Boolean` —— 窗口是否可以被用戶移動。在 Linux 上總是返回 `true`。
#### `win.setMinimizable(minimizable)` _macOS_ _Windows_
* `minimizable` Boolean
設置窗口是否可以被用戶手動最小化。在 Linux 上什么也不做。
#### `win.isMinimizable()` _macOS_ _Windows_
返回 `Boolean` —— 窗口是否可以被用戶手動最小化。在 Linux 上總是返回 `true`。
#### `win.setMaximizable(maximizable)` _macOS_ _Windows_
* `maximizable` Boolean
設置窗口是否可以被用戶手動最大化。在 Linux 上什么也不做。
#### `win.isMaximizable()` _macOS_ _Windows_
返回 `Boolean` —— 窗口是否可以被用戶手動最大化。在 Linux 上總是返回 `true`。
#### `win.setFullScreenable(fullscreenable)`
* `fullscreenable` Boolean
設置窗口的 最大化/縮放 按鈕是否可以切換全屏模式或者最大化窗口。
#### `win.isFullScreenable()`
返回 `Boolean` —— 是否窗口的 最大化/縮放按鈕 可以切換全屏模式或者最大化窗口。
#### `win.setClosable(closable)` _macOS_ _Windows_
* `closable` Boolean
設置窗口是否可以被用戶手動關閉。在 Linux 上什么也不做。
#### `win.isClosable()` _macOS_ _Windows_
返回 `Boolean` —— 窗口是否可以被用戶手動關閉。在 Linux 上總是返回 `true`。
#### `win.setAlwaysOnTop(flag[, level])`
* `flag` Boolean
* `level` String (可選) _macOS_ —— 包括 `normal`, `floating`, `torn-off-menu`, `modal-panel`, `main-menu`, `status`, `pop-up-menu`, `screen-saver`,和 `dock` 的值。默認的是 `floating`。查看
[macOS docs][window-levels] 了解詳情。
設置窗口是否可以總是顯示在其它窗口的上方。當設置了它,窗口仍然是一個普通窗口,而不是一個不能被聚焦的 toolbox 窗口。
#### `win.isAlwaysOnTop()`
返回 `Boolean` —— 是否窗口總是在其它窗口上方。
#### `win.center()`
移動窗口到屏幕中央。
#### `win.setPosition(x, y[, animate])`
* `x` Integer
* `y` Integer
* `animate` Boolean (可選) _macOS_
移動窗口到 `x` 和 `y`。
#### `win.getPosition()`
返回 `Integer[]` —— 包括窗口當前的位置。
#### `win.setTitle(title)`
* `title` String
修改原生窗口的標題為 `title`。
#### `win.getTitle()`
返回 `String` —— 或者原生窗口的標題。
**注意:** web 頁面的標題可以不同于原生窗口的標題。
#### `win.setSheetOffset(offsetY[, offsetX])` _macOS_
* `offsetY` Float
* `offsetX` Float (可選)
Changes the attachment point for sheets on macOS. 默認, sheets are
attached just below the window frame, 但是你可能想要在一個 HTML 渲染的工具欄之下顯示它們。例如:
```javascript
const {BrowserWindow} = require('electron')
let win = new BrowserWindow()
let toolbarRect = document.getElementById('toolbar').getBoundingClientRect()
win.setSheetOffset(toolbarRect.height)
```
#### `win.flashFrame(flag)`
* `flag` Boolean
開始或者停止閃動窗口來引起用戶的注意。
#### `win.setSkipTaskbar(skip)`
* `skip` Boolean
使窗口不顯示在任務欄中。
#### `win.setKiosk(flag)`
* `flag` Boolean
進入或者離開 kiosk 模式。
#### `win.isKiosk()`
返回 `Boolean` —— 窗口是否在 kiosk 模式。
#### `win.getNativeWindowHandle()`
返回 `Buffer` —— 平臺特定的窗口處理。
在 Windows 上處理程序的原生類型是 `HWND` , 在 macOS 上是 `NSView*` ,在 Linux 上是 `Window` (`unsigned long`)。
#### `win.hookWindowMessage(message, callback)` _Windows_
* `message` Integer
* `callback` Function
掛住一個窗口消息。 當消息在 WndProc 中被接收到 `callback` 被調用。
#### `win.isWindowMessageHooked(message)` _Windows_
* `message` Integer
返回 `Boolean` —— `true` 或 `false` 取決于消息是否被掛住。
#### `win.unhookWindowMessage(message)` _Windows_
* `message` Integer
松開窗口消息。
#### `win.unhookAllWindowMessages()` _Windows_
松開所有的窗口消息。
#### `win.setRepresentedFilename(filename)` _macOS_
* `filename` String
設置窗口展現的文件的路徑名,和在窗口的標題欄中顯示的 文件的 icon 。
#### `win.getRepresentedFilename()` _macOS_
返回 `String` —— 窗口呈現的文件的路徑名。
#### `win.setDocumentEdited(edited)` _macOS_
* `edited` Boolean
指定窗口的文檔是否被編輯過,如果設置為 `true` 標題欄中的 icon 將會變灰。
#### `win.isDocumentEdited()` _macOS_
是否 `Boolean` —— 窗口的文檔是否被編輯過。
#### `win.focusOnWebView()`
#### `win.blurWebView()`
#### `win.capturePage([rect, ]callback)`
* `rect` [Rectangle](structures/rectangle.md) (可選) —— 要捕獲的邊界。
* `callback` Function
* `image` [NativeImage](native-image.md)
和 `webContents.capturePage([rect, ]callback)` 相同。
#### `win.loadURL(url[, options])`
* `url` URL
* `options` Object (可選)
* `httpReferrer` String —— 一個 HTTP Referrer url。
* `userAgent` String —— 一個請求源的用戶代理。
* `extraHeaders` String —— 通過 "\n" 分隔的額外的 headers。
和 `webContents.loadURL(url[, options])` 相同。
`url` 可以是一個遠程地址(例如 `http://`)或者一個本地 HTML 文件路徑,使用 `file://` 協議。
要確保文件 URLs 被正確的格式化,建議使用 Node 的 [`url.format`](https://nodejs.org/api/url.html#url_url_format_urlobject) 方法:
```javascript
let url = require('url').format({
protocol: 'file',
slashes: true,
pathname: require('path').join(__dirname, 'index.html')
})
win.loadURL(url)
```
#### `win.reload()`
和 `webContents.reload` 相同。
#### `win.setMenu(menu)` _Linux_ _Windows_
* `menu` Menu
設置 `menu` 作為窗口的菜單欄。設置為 `null` 將會移除菜單欄。
#### `win.setProgressBar(progress[, options])`
* `progress` Double
* `options` Object (可選)
* `mode` String _Windows_ —— 進度條的模式(`none`, `normal`, `indeterminate`, `error`, 或 `paused`)
設置進度條中的進度值。有效范圍在 [0, 1.0]。
當進度小于0時移除進度條;
當進度大于1進入不確定模式。
在 Linux 平臺,只支持 Unity 桌面環境,你需要在 `package.json` 中指定 `*.desktop` 文件名到 `desktopName` 字段 。默認,它將假設 `app.getName().desktop`。
在 Windows 上,一個模式可以被傳遞。接受的值為 `none`, `normal`,`indeterminate`, `error` 和 `paused`。 如果你調用 `setProgressBar` 而沒有使用一個模式設置(但是有一個可用范圍的值), `normal` 被會假定。
#### `win.setOverlayIcon(overlay, description)` _Windows_
* `overlay` [NativeImage](native-image.md) —— 任務欄 icon右下角顯示的 icon 。如果這個參數是 `null`, 覆蓋被清除。
* `description` String —— 將會提供給易訪問屏幕閱讀器的一個描述。
設置一個 16 x 16 像素的覆蓋到當前的任務欄 icon ,通常用來傳達一些應用狀態的種類或者消極通知用戶。
#### `win.setHasShadow(hasShadow)` _macOS_
* `hasShadow` Boolean
設置窗口是否有一個陰影。在 Windows 和 Linux 上什么也不做。
#### `win.hasShadow()` _macOS_
返回 `Boolean` —— 窗口是否有一個陰影。
在 Windows 和 Linux 上總是返回 `true`。
#### `win.setThumbarButtons(buttons)` _Windows_
* `buttons` [ThumbarButton[]](structures/thumbar-button.md)
返回 `Boolean` —— 是否按鈕添加成功。
使用一個指定的按鈕設置增加一個縮略圖工具欄到任務欄按鈕布局中。返回一個 `Boolean` 對象表示縮略圖是否被成功添加。
在縮略圖工具欄中按鈕的數量,由于有限的空間應該不大于 7。 一旦設置了縮略圖工具欄,由于平臺的限制工具欄不能被移除。但是你可以調用這個 API 使用一個空的數組來清除按鈕。
`buttons` 是一個 `Button` 對象的數組:
* `Button` Object
* `icon` [NativeImage](native-image.md) —— 顯示在縮略圖工具欄中的 icon 。
* `click` Function
* `tooltip` String (可選) —— 按鈕的 tooltip 的文本。
* `flags` String[] (可選) —— 控制指定按鈕的狀態和行為。默認的,它是 `['enabled']`。
`flags` 是一個可以包含如下 `String` 的數組:
* `enabled` —— 按鈕激活并可以被用戶使用。
* `disabled` —— 按鈕被禁用。它被呈現,但是有一個表示不能響應用戶操作的可視狀態。
* `dismissonclick` —— 當按鈕被點擊,縮略圖窗口會被立即關閉。
* `nobackground` —— 不繪制按鈕 border,只使用圖片。
* `hidden` —— 按鈕不顯示給用戶。
* `noninteractive` —— 按鈕被啟用,但是沒有交互;不繪制按下按鈕狀態。這個值被用在一個通知中的按鈕實例繼承。
#### `win.setThumbnailClip(region)` _Windows_
* `region` [Rectangle](structures/rectangle.md) —— 窗口范圍。
設置當懸停到任務欄上的窗口上時顯示為縮略圖的窗口的區域。可以通過指定一個空的范圍重設縮略圖為整個窗口:`{x: 0, y: 0, width: 0, height: 0}`.
#### `win.setThumbnailToolTip(toolTip)` _Windows_
* `toolTip` String
設置當懸停到任務欄上的窗口縮略圖時顯示的 toolTip 。
#### `win.showDefinitionForSelection()` _macOS_
和 `webContents.showDefinitionForSelection()` 相同。
#### `win.setIcon(icon)` _Windows_ _Linux_
* `icon` [NativeImage](native-image.md)
修改窗口 icon。
#### `win.setAutoHideMenuBar(hide)`
* `hide` Boolean
設置窗口菜單欄是否可以自己自動隱藏。一旦設置,菜單欄只有當用戶按下 `Alt` 鍵才能顯示。
如果菜單欄已經可見,調用 `setAutoHideMenuBar(true)` 不會立即隱藏它。
#### `win.isMenuBarAutoHide()`
返回 `Boolean` —— 菜單欄是否自己自動隱藏。
#### `win.setMenuBarVisibility(visible)` _Windows_ _Linux_
* `visible` Boolean
設置菜單欄是否可見。如果菜單欄是自動隱藏,用戶仍然可以通過按下 `Alt` 鍵調出菜單欄。
#### `win.isMenuBarVisible()`
返回 `Boolean` —— 菜單欄是否可見。
#### `win.setVisibleOnAllWorkspaces(visible)`
* `visible` Boolean
設置窗口是否可以顯示在所有工作空間。
**注意:** 這個 API 在 Windows 上不做任何事。
#### `win.isVisibleOnAllWorkspaces()`
返回 `Boolean` —— 窗口是否在所有工作空間中可見。
**注意:** 這個 API 在 Windows 上總是返回 false 。
#### `win.setIgnoreMouseEvents(ignore)`
* `ignore` Boolean
使窗口忽略所有的鼠標事件。
這個窗口上發生的所有鼠標事件都會被傳遞到下面的窗口,但是如果這個窗口有焦點,仍然可以接受鍵盤事件。
#### `win.setContentProtection(enable)` _macOS_ _Windows_
* `enable` Boolean
阻止窗口內容被其它應用捕獲。
在 macOS 上它設置 `NSWindow` 的 `sharingType` 為 `NSWindowSharingNone`。
在 Windows 上它調用 `SetWindowDisplayAffinity` 使用 `WDA_MONITOR`。
#### `win.setFocusable(focusable)` _Windows_
* `focusable` Boolean
修改窗口是否可以獲得焦點。
* [blink-feature-string]: https://cs.chromium.org/chromium/src/third_party/WebKit/Source/platform/RuntimeEnabledFeatures.in
#### `win.setParentWindow(parent)` _Linux_ _macOS_
* `parent` BrowserWindow
設置 `parent` 作為當前窗口的父窗口,傳遞 `null` 會使當前窗口成為一個 toop-level 窗口。
#### `win.getParentWindow()`
返回 `BrowserWindow` —— 父窗口。
#### `win.getChildWindows()`
返回 `BrowserWindow[]` —— 所有子窗口。
* [window-levels]: https://developer.apple.com/reference/appkit/nswindow/1664726-window_levels
* [quick-look]: https://en.wikipedia.org/wiki/Quick_Look
- 索引
- 前言.關于Electron
- 第一部分 開發指南
- 第1章.平臺支持
- 第2章.安全、原生功能和你的責任
- 第3章.版本說明
- 第4章.發行應用
- 第5章.Mac App商店提交指南
- 第6章.Windows商店指南
- 第7章.應用打包
- 第8章.使用Node原生模塊
- 第9章.調試主進程
- 9.1.在VSCode中調試
- 9.2.在node-inspector中調試
- 第10章.使用Selenium和WebDriver
- 第11章.DevTools擴展
- 第12章.使用Pepper Flash插件
- 第13章.使用Widevine CDM插件
- 第14章.通過自動化持續集成系統進行測試
- 第15章.離屏渲染
- 第二部分 使用教程
- 第16章.快速入門
- 第17章.桌面環境集成
- 第18章.在線/離線事件探測
- 第19章.應答式編譯器(REPL)
- 第三部分 API參考
- 第20章.API簡介
- 第21章.進程對象
- 第22章.Chrome的命令行開關
- 第23章.環境變量
- 第24章.定制的DOM元素
- 24.1.File 對象
- 24.2.webview 標簽
- 第25章.主進程模塊
- 25.1.app
- 25.2.BrowserWindow
- 25.3.無框架窗口
- 第26章.渲染進程模塊
- 第27章.兩種進程可用的模塊
- 第四部分 高級主題
- 附 FAQ
- 附 文檔規范
- 附 示例用例
- 1.無邊框窗口