LoginSignup
23
20

More than 5 years have passed since last update.

ElectronでMacのスリープ・ロックを検知する

Posted at

やりたいこと

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() というやり取りです。

これでスリープ、ロックを検知して処理を行うことが可能になりました。

23
20
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
23
20