やりたいこと
Electronでスリープやロックを検知して色々やりたい
環境
- OS X El Capitan
- Electron 1.4
本題
どちらもメインプロセス内で検知します。
なので、検知処理は package.json の mainとして定義したjsファイル内で呼ぶ必要があります。
スリープ
const electron = require('electron')
const app = electron.app
app.on('ready', () => {
electron.powerMonitor.on('suspend', () => {
console.log('suspend') // スリープ時
})
electron.powerMonitor.on('resume', () => {
console.log('resume') // スリープからの復帰
})
})
powerMonitor を使って検知できます。
powerMonitor は app の readyイベント以降でしか支えないので、readyイベントのcallback内で呼び出します。
ロック
const electron = require('electron')
const app = electron.app
const BrowserWindow = electron.BrowserWindow
let mainWindow
function createWindow () {
mainWindow = new BrowserWindow({width: 1000, height: 600})
mainWindow.loadURL(`file://${__dirname}/index.html`)
mainWindow.on('hide', () => {
console.log('hide') // Lock時
})
mainWindow.on('show', () => {
console.log('show') // Lock解除時
})
}
app.on('ready', () => {
createWindow()
})
BrowserWindowモジュールの hide, show で検知します。
検知したあとは
メインプロセス内で完結する処理であれば問題ないですが、レンダラープロセスに伝える必要があることがほとんどだと思います。
その場合はwebContents, ipcRendererの両モジュールを使って Main→Rendererに伝達します。
main.js
const electron = require('electron')
const app = electron.app
let mainWindow
function createWindow () {
mainWindow = new BrowserWindow({width: 1000, height: 600})
mainWindow.loadURL(`file://${__dirname}/index.html`)
}
app.on('ready', () => {
electron.powerMonitor.on('suspend', () => {
console.log('suspend') // スリープ時
// 'suspend' をレンダラーに送る
mainWindow.webContents.send('asynchronous-reply', 'suspend')
})
electron.powerMonitor.on('resume', () => {
console.log('resume') // スリープからの復帰
})
createWindow()
})
renderer.js
(function() {
const {ipcRenderer} = require('electron')
ipcRenderer.on('asynchronous-reply', (event, arg) => {
console.log(arg) // 'suspend' が表示される
})
})();
BrowserWindow.webContents.send() → ipcRenderer.on() というやり取りです。
これでスリープ、ロックを検知して処理を行うことが可能になりました。