0

0

0

修罗

站点介绍

只有了解事实才能获得真正的自由

Electron主进程

修罗 2022-11-29 769 0条评论 electron

首页 / 正文

目录

https://www.electronjs.org/zh/docs/latest/api/app

1 App

1.1 事件

1.1.1 before-quit

在应用程序关闭窗口之前触发。
app.on('before-quit', (e) => {
  console.log('App is quiting')
  e.preventDefault()
})

1.1.2 browser-window-blur

在 browserWindow 失去焦点时发出
app.on('browser-window-blur', (e) => {
  console.log('App unfocused')
})

1.1.3 browser-window-focus

在 browserWindow 获得焦点时发出
app.on('browser-window-focus', (e) => {
  console.log('App focused')
})

1.2 方法

1.2.1 app.quit()

https://www.electronjs.org/zh/docs/latest/api/app#appquit
app.on('browser-window-blur', (e) => {
  setTimeout(() => {
    app.quit()
  }, 3000)
})

app.on('browser-window-blur', (e) => {
  setTimeout(app.quit, 3000)
})

1.2.2 app.getPath(name)

app.whenReady().then(() => {
  console.log(app.getPath('desktop'))
  console.log(app.getPath('music'))
  console.log(app.getPath('temp'))
  console.log(app.getPath('userData'))
})

image-20221129141245784.png

2 BrowserWindow

electron.BrowserWindow: 创建和控制浏览器窗口
const win = new BrowserWindow({
    height:600,
    width:900
})

2.1 实例方法

win.loadURL(url[, options])loadFile 互斥

mainWindow.loadURL('https://www.baidu.com')

2.2 优雅的显示窗口

  • 使用ready-to-show事件: 页面完成渲染再显示窗口
let mainWindow = new BrowserWindow({ show: false })
mainWindow.once('ready-to-show', () => {
  mainWindow.show()
})
  • 设置 backgroundColor
let win = new BrowserWindow({ backgroundColor: '#2e2c29' })

2.3 父子窗口

secondaryWindow = new BrowserWindow({
  parent: mainWindon, // 定义父窗口
  modal: true // 禁用父窗口的子窗口
})
  • 子窗口显示和隐藏
secondaryWindow = new BrowserWindow({
  show: false
})

setTimeout(() => {
  secondaryWindow.show()
  setTimeout(() => {
    secondaryWindow.hide()
  }, 3000)
}, 2000)

image-20221129142211867.png

2.4 无边框窗口

Frameless Window
mainWindow = new BrowserWindow({
  frame: false
})

无边框窗口,不可拖拽

image-20221129142241298.png

让页面可拖拽

<body style="user-select: none; -webkit-app-region:drag;">

给不需要点击拖动页面的元素添加no-drag

<input style="-webkit-app-region: no-drag;" type="range" name="range" min="0" max="10">

是否显示关闭窗口工具栏

mainWindow = new BrowserWindow({
  titleBarStyle: 'hidden' // or hiddenInset 距离红绿灯更近
})

image-20221129142711227.png

2.5 属性与方法

2.5.1 minWidth && minHeight

mainWindow = new BrowserWindow({
  minWidth: 300,
  minHeight: 300
})

更多详见:https://electronjs.org/docs/api/browser-window#new-browserwindowoptions

2.5.2 窗口焦点事件

secWindow = 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')
})

2.5.3 静态方法

  • getAllWindows()
let allWindows = BrowserWindow.getAllWindows()
console.log(allWindows)

更多详见: https://electronjs.org/docs/api/browser-window#%E9%9D%99%E6%80%81%E6%96%B9%E6%B3%95

2.5.4 实例方法

  • maximize()
secWindow.on('closed', () => {
  mainWindow.maximize()
})

更多详见:https://electronjs.org/docs/api/browser-window#%E5%AE%9E%E4%BE%8B%E6%96%B9%E6%B3%95

2.6 state

electron-win-state 保存窗口的状态: npm install electron-win-state

const { app, BrowserWindow,ipcMain } = require('electron')
const windowStateKeeper = require('electron-window-state');

const createWindow = () => {
    let mainWindowState = windowStateKeeper({
        defaultWidth: 1000,
        defaultHeight: 800
    });
    const win = new BrowserWindow({
      'x': mainWindowState.x,
      'y': mainWindowState.y,
      'width': mainWindowState.width,
      'height': mainWindowState.height
    })
    mainWindowState.manage(win)

    win.loadFile('./index.html')
}

app.whenReady().then(() => {
  createWindow()
})

2.7 webContents

webContents 是 EventEmitter 的实例, 负责渲染和控制网页, 是 BrowserWindow 对象的一个属性。
let wc = mainWindow.webContents
// 打开调试
wc.openDevTools();
console.log(wc)

image-20221129143908518.png

2.7.1 方法 getAllWebContents()

  • 返回所有 WebContents 实例的数组。 包含所有Windows,webviews,opened devtools 和 devtools 扩展背景页的 web 内容
const {app, BrowserWindow, webContents} = require('electron')
console.log(webContents.getAllWebContents())

2.7.2 实例事件

  • did-finish-load:请求资源完毕触发
  • dom-ready:dom渲染完毕,请求资源尚未完成触发
<div>
   <img src="https://placekitten.com/500/500" alt="">
</div>
<script>
let wc = mainWindow.webContents
wc.on('did-finish-load', () => {
  console.log('Conent fully loaded')
})
wc.on('dom-ready', () => {
  console.log('DOM Ready')
})
</script>
  • new-window
<div>
   默认点击打开新窗口
  <a target="_blank" href="https://placekitten.com/500/500"><h3>Kitten</h3></a>
</div>

<script>
wc.on('new-window', (e, url) => {
  e.preventDefault()
  console.log('DOM Ready')
})
</script>
  • context-menu : 右键上下文信息
wc.on('context-menu', (e, params) => {
  console.log(`Context menu opened on: ${params.mediaType} at x:${params.x}, y:${params.y}`)
})

wc.on('context-menu', (e, params) => {
  console.log(`User seleted text: ${params.selectionText}`)
  console.log(`Selection can be copied: ${params.editFlags.canCopy}`)
})

2.7.3 实例方法

  • executeJavaScript()
wc.on('context-menu', (e, params) => {
  wc.executeJavaScript(`alert('${params.selectionText}')`)
})

3 dialog - 对话框

显示用于打开和保存文件、警报等的本机系统对话框

打开文件

const {app, BrowserWindow, dialog} = require('electron')

mainWindow.webContents.on('did-finish-load', () => {
  dialog.showOpenDialog({
    buttonLabel: '选择',
    defaultPath: app.getPath('desktop'),
    properties: ['multiSelections', 'createDirectory', 'openFile', 'openDirectory']
  }).then((result)=> {
    console.log(result)
  })
})

image-20221129144630724.png

保存文件

dialog.showSaveDialog({}).then(result => {
  console.log(result)
})

选择弹框

const answers = ['Yes', 'No', 'Maybe']
dialog.showMessageBox({
  title: 'Message Box',
  message: 'Please select an option',
  detail: 'Message details.',
  buttons: answers
}).then(({response}) => {
  console.log(`User selected: ${answers[response]}`)
})

image-20221129144858846.png

4 快捷键+系统快捷键

快捷键:定义键盘快捷键。
系统快捷键:在应用程序没有键盘焦点时,监听键盘事件。

快捷键可以包含多个功能键和一个键码的字符串,由符号+结合,用来定义你应用中的键盘快捷键

示例:

  • CommandOrControl+A
  • CommandOrControl+Shift+Z

快捷方式使用 register 方法在 globalShortcut 模块中注册。

globalShortcut 模块可以在操作系统中注册/注销全局快捷键, 以便可以为操作定制各种快捷键。

注意: 快捷方式是全局的; 即使应用程序没有键盘焦点, 它也仍然在持续监听键盘事件。 在应用程序模块发出 ready 事件之前, 不应使用此模块。

const {app, BrowserWindow, globalShortcut} = require('electron')

globalShortcut.register('G', () => {
  console.log('User pressed G')
})
globalShortcut.register('CommandOrControl+Y', () => {
  console.log('User pressed G with a combination key')
  globalShortcut.unregister('CommandOrControl+Y')
})

5 Menu

const { app, BrowserWindow, Menu } = require('electron')
const createWindow = () => {
    // 1.
    let mainMenu = Menu.buildFromTemplate( require('./mainMenu') )
    
    const win = new BrowserWindow({
      'width': 1000,
      'height': 900
    })
    // 2.
    Menu.setApplicationMenu(mainMenu)
    
    win.loadFile('./index.html')

}


app.whenReady().then(() => {
  createWindow()
})

mainMenu.js

传递数据可以导出函数,传出数据可以用回调函数

module.exports = [
  {
    label: 'Electron',
    submenu: [
      { label: 'Item 1'},
      { label: 'Item 2', submenu: [ { label: 'Sub Item 1'} ]},
      { label: 'Item 3'},
    ]
  },
  {
    label: 'Edit',
    submenu: [
      { role: 'undo'},
      { role: 'redo'},
      { role: 'copy'},
      { role: 'paste'},
    ]
  },
  {
    label: 'Actions',
    submenu: [
      {
        label: 'DevTools',
        role: 'toggleDevTools'
      },
      {
        role: 'toggleFullScreen'
      },
      {
        label: 'Greet',
        click: () => { console.log('Hello from Main Menu') },
          // 快捷键
        accelerator: 'Shift+Alt+G'
      }
    ]
  }
]

image-20221129145625367.png

传递数据可以导出函数,传出数据可以用回调函数

module.exports = (data, callback) => ([
    {
        label: 'Electron',
        submenu: [
        { label: 'Item 1'},
        { label: 'Item 2', submenu: [ { label: 'Sub Item 1'} ]},
        { label: 'Item 3'},
        ]
    },
    {
        label: 'Edit',
        submenu: [
        { role: 'undo'},
        { role: 'redo'},
        { role: 'copy'},
        { role: 'paste'},
        ]
    },
    {
        label: 'Actions',
        submenu: [
        {
            label: 'DevTools',
            role: 'toggleDevTools'
        },
        {
            role: 'toggleFullScreen'
        },
        {
            label: 'Greet',
            click: () => {
                console.log(data);
                callback('haha')
            },
            // 快捷键
            accelerator: 'Shift+Alt+G'
        }
        ]
    }
])

main.js

let mainMenu = Menu.buildFromTemplate( require('./mainMenu')('传入数据',(data)=>{
    console.log(data);
}) )

6 Context Menus

main.js

const { app, BrowserWindow, Menu } = require('electron')
const createWindow = () => {
    // 1.
    let mainMenu = Menu.buildFromTemplate( require('./mainMenu') )
    
    const win = new BrowserWindow({
      'width': 1000,
      'height': 900
    })
    // 2.
    Menu.setApplicationMenu(mainMenu)
    
    win.loadFile('./index.html')
    // 监听鼠标右键
    win.webContents.on('context-menu', e => {
      // 3.鼠标点击右键弹出菜单
      contextMenu.popup()
    })
}


app.whenReady().then(() => {
  createWindow()
})

image-20221129145756765.png

7 Tray (托盘)

main.js

const { app, BrowserWindow, Menu, Tray } = require('electron')
const path = require('path')

const createWindow = () => {
    const win = new BrowserWindow({
        height:1080,
        width:1920
    })
    
    win.loadURL('')
    
    // 点击关闭时触发close事件
    win.on('close',(e)=>{
        // 阻止默认关闭,隐藏窗口,隐藏任务栏窗口
        e.preventDefault()
        win.hide();
        win.setSkipTaskbar(true);
    })

    // 1.新建托盘
    let tray = new Tray(path.join(__dirname, 'favicon.ico'));
    // 2.托盘名称
    tray.setToolTip('Electron Tray');
    // 3.托盘菜单
    const contextMenu = Menu.buildFromTemplate([{
            label: '显示',
            click: () => { win.show() }
        },
        {
            label: '退出',
            click: () => { 
                win.destroy() 
            }
        }
    ]);
    // 4.载入托盘菜单
    tray.setContextMenu(contextMenu);
    
    // 5.双击触发
    tray.on('double-click', () => {
        // 双击通知区图标实现应用的显示或隐藏
        win.isVisible() ? win.hide() : win.show()
        win.isVisible() ? win.setSkipTaskbar(false) : win.setSkipTaskbar(true);
    });
}


app.whenReady().then(() => {
    createWindow()
})

image-20221129150939640.png

评论(0)


最新评论

  • https://www.studyglobus.com/author/carroll34a5552/

    Ценники на вывоз мусора сейчас космос, любые лайфхаки по экономии в тему.

  • Richardgrold

    1xbet onlayn kazino platforması ilə vaxtınızı daha səmərəli və maraqlı keçirin. Saytın canlı kazino bölməsi istifadəçilərə fərqli bir dünya təklif edir. Burada canlı dilerli kazino oyunlarının hər bir növünü sınaqdan keçirə bilərsiniz. Krupyelərin peşəkarlığı oyunun dinamikasını və marağını artırır. Müntəzəm olaraq yenilənən oyun siyahısı cansıxıcılığa yol vermir. Hesabınızı artırmaq üçün onlarla fərqli və etibarlı üsul mövcuddur. Qazanılan pullar cəmi bir neçə dəqiqə ərzində şəxsi hesabınıza köçürülür. Aktiv fəaliyyətinizə görə fərdi bonuslar və hədiyyələr qazana bilərsiniz. Dəstək xidməti həm çat, həm də e-poçt vasitəsilə kömək göstərir. 1xbet ailəsinə qoşulun və böyük uduşlar üçün ilk addımı atın. onlayn kazino

  • 砂岩白丘

    我一直梦想, 看到你们相册那样的地方。真棒。

  • 城市地標

    我喜欢, 这里分享真实经验。你的项目 就是 属于这里的。请继续。

  • 宗教地標

    我热爱这样的想法, 去那么多国家。真的很鼓舞。

  • 觀景高地

    能感受到热爱。继续保持 感受。

  • 最佳季節

    我关注这样的资源, 写得很实在。你的网站 就是 属于这里的。加油。

  • 1

    1

  • 1

    1

  • -1' OR 2+158-158-1=0+0+0+1 or 'TKCTZnRa'='

    1

日历

2026年07月

   1234
567891011
12131415161718
19202122232425
262728293031 

文章目录

推荐关键字: Linux webpack js 算法 MongoDB laravel JAVA jquery javase redis