Main Process API
App事件ready:Electron API (Electron API 有三種)Main Process (主進程序)Renderer Process(渲染程序)Share Modules(共享模組)
兩種使用方法當 Electron 完成初始化時被觸發。
app.on('ready', createWindow)app.on('ready', () => { console.log('App is ready!') createWindow()})
檢查應用是否登入:app.isReady()如果應用沒有Ready,app.isReady()的值為 falseconsole.log('應用是否登入:' + app.isReady())
此時應用應該已經Ready
setTimeout(() => { console.log('應用是否登入:' + app.isReady())}, 2000)
before-quit在應用程式開始關閉視窗之前觸發。
app.on('before-quit', (e) => { console.log('App is quiting') e.preventDefault()})
browser-window-blur在 browserWindow 失去焦點時發出
app.on('browser-window-blur', (e) => { console.log('App unfocused')})
browser-window-focus在 browserWindow 獲得焦點時發出
app.on('browser-window-focus', (e) => { console.log('App focused')})
方法app.quit()app.on('browser-window-blur', (e) => { setTimeout(() => { app.quit() }, 3000)})app.on('browser-window-blur', (e) => { setTimeout(app.quit, 3000)})
app.getPath(name)
app.on('ready', () => { console.log(app.getPath('desktop')) console.log(app.getPath('music')) console.log(app.getPath('temp')) console.log(app.getPath('userData')) createWindow()})
BrowserWindow例項方法electron.BrowserWindow: 建立和控制瀏覽器視窗
win.loadURL(url[, options]): 和 loadFile 互斥
mainWindow.loadURL('https://www.baidu.com')
優雅的顯示視窗使用ready-to-show事件let mainWindow = new BrowserWindow({ show: false })mainWindow.once('ready-to-show', () => { mainWindow.show()})
設定 backgroundColor
let win = new BrowserWindow({ backgroundColor: '#2e2c29' })
父子視窗視窗定義
secondaryWindow = new BrowserWindow({ width: 600, height: 600, webPreferences: { nodeIntegration: true }})secondaryWindow.loadFile('index.html')secondaryWindow.on('closed', () => { mainWindow = null})
視窗關係
secondaryWindow = new BrowserWindow({ parent: mainWindon, // 定義父視窗 modal: true // 鎖定在主視窗})
子視窗顯示和隱藏
secondaryWindow = new BrowserWindow({ show: false})setTimeout(() => { secondaryWindow.show() setTimeout(() => { secondaryWindow.hide() }, 3000)}, 2000)
無邊框視窗Frameless Window
mainWindow = new BrowserWindow({ frame: false})
讓頁面可拖拽
<body style="user-select: none; -webkit-app-region:drag;">
no-drag 修復下面控制元件的bug
<input style="-webkit-app-region: no-drag;" type="range" name="range" min="0" max="10">
顯示紅綠燈
mainWindow = new BrowserWindow({ titleBarStyle: 'hidden' // or hiddenInset 距離紅綠燈更近})
屬性與方法minWidth && minHeight
mainWindow = new BrowserWindow({ minWidth: 300, minHeight: 300})
更多詳見:/file/2020/08/28/20200828172223_1.jpg = new BrowserWindow({ width: 400, height: 300, webPreferences: { nodeIntegration: true },})mainWindow.on('focus', () => { console.log('mainWindow focused')})secWindow.on('focus', () => { console.log('secWindow focused')})app.on('browser-window-focus', () => { console.log('App focused')})靜態方法getAllWindows()
let allWindows = BrowserWindow.getAllWindows()console.log(allWindows)
更多詳見: /file/2020/08/28/20200828172224_2.jpg () => { mainWindow.maximize() })更多詳見:/file/2020/08/28/20200828172225_3.jpg 儲存視窗的狀態 npm install electron-window-state
webContents起步建立session物件webContents 是 EventEmitter 的例項, 負責渲染和控制網頁, 是 BrowserWindow 物件的一個屬性。let wc = mainWindow.webContents console.log(wc)
let session = mainWindow.webContents.sessionconsole.log(session) // {}
在chromium 建立localStorage,然後建立兩個視窗,兩個session共享
mainWindow = new BrowserWindow({ width: 1000, height: 800, webPreferences: { nodeIntegration: true }})secWindow = new BrowserWindow({ width: 500, height: 400, webPreferences: { nodeIntegration: true }})let session = mainWindow.webContents.sessionlet session2 = mainWindow.webContents.sessionconsole.log(Object.is(session, session2)) // true// Load index.html into the new BrowserWindowmainWindow.loadFile('index.html')secWindow.loadFile('index.html')// Open DevTools - Remove for PRODUCTION!mainWindow.webContents.openDevTools();secWindow.webContents.openDevTools();// Listen for window being closedmainWindow.on('closed', () => { mainWindow = null})secWindow.on('closed', () => { secWindow = null})
defaultSessionconst {app, BrowserWindow, session} = require('electron')let ses = mainWindow.webContents.sessionconsole.log(Object.is(session.defaultSession, ses)) // true
自定義session
let customSes = session.fromPartition('part1')console.log(Object.is(customSes, ses)) //false, 此時customSes 還是共享sessionsecWindow = new BrowserWindow({ width: 500, height: 400, webPreferences: { nodeIntegration: true, session: customSes // 定義session, 此時子視窗有自己的session }})// 在子窗口裡建立localstorge: winName/secWindow// 關閉所有視窗,發現建立的localstorage又消失了,因為此時的session儲存在記憶體裡,重新啟動應用又消失了。可以加字首persist,使其變為永久儲存:let customSes = session.fromPartition('persist:part1')// 或者:secWindow = new BrowserWindow({ width: 500, height: 400, webPreferences: { nodeIntegration: true, - session: customSes + partition: 'persist:part1' }})
例項方法ses.clearStorageData() // 刪除主視窗的的storage
cookie查詢和修改一個會話的cookies
// 查詢所有 cookiessession.defaultSession.cookies.get({}) .then((cookies) => { console.log(cookies) }).catch((error) => { console.log(error) })// 查詢所有與設定的 URL 相關的所有 cookiessession.defaultSession.cookies.get({ url: 'http://www.github.com' }) .then((cookies) => { console.log(cookies) }).catch((error) => { console.log(error) })// 設定一個 cookie,使用設定的名稱;// 如果存在,則會覆蓋原先 cookie.const cookie = { url: 'http://www.github.com', name: 'dummy_name', value: 'dummy' }session.defaultSession.cookies.set(cookie) .then(() => { // success }, (error) => { console.error(error) })
downloadItem控制來自於遠端資源的檔案下載。
const {app, BrowserWindow, dialog} = require('electron')mainWindow.webContents.on('did-finish-load', () => { dialog.showOpenDialog({ buttonLabel: '選擇', defaultPath: app.getPath('desktop'), properties: ['multiSelections', 'createDirectory', 'openFile', 'openDirectory'] }, filepaths => { console.log(filepaths) })})dialog.showSaveDialog({}, filename => { console.log(filename)})const answers = ['Yes', 'No', 'Maybe']dialog.showMessageBox({ title: 'Message Box', message: 'Please select an option', detail: 'Message details.', buttons: answers}, response => { console.log(`User selected: ${answers[response]}`)})
快捷鍵+系統快捷鍵快捷鍵:定義鍵盤快捷鍵。 系統快捷鍵:在應用程式沒有鍵盤焦點時,監聽鍵盤事件。
快捷鍵可以包含多個功能鍵和一個鍵碼的字串,由符號+結合,用來定義你應用中的鍵盤快捷鍵
示例:
CommandOrControl+ACommandOrControl+Shift+Z快捷方式使用 register 方法在 globalShortcut 模組中註冊。
globalShortcut 模組可以在作業系統中註冊/登出全域性快捷鍵, 以便可以為操作定製各種快捷鍵。
注意: 快捷方式是全域性的; 即使應用程式沒有鍵盤焦點, 它也仍然在持續監聽鍵盤事件。 在應用程式模組發出 ready 事件之前, 不應使用此模組。