Как обнаружить простаивание системы в приложении Electron и что-то сделать

#javascript #node.js #electron

Вопрос:

Я разработал приложение, и я хочу сделать это, если пользователь ничего не сделает за 30 минут, закройте приложение.

Поэтому я поискал его в Google, чтобы решить эту проблему, и обнаружил, что в electron есть API PowerMonitor, но проблема в том, что мое приложение старой версии (Electron 3.1.14), поэтому оно не поддерживает различные методы.

Электронные документы API PowerMonitor

Я думаю, что мне следует использовать powerMonitor.querySystemIdleTime() метод, и я попытался протестировать API «pwoerMonitor», поэтому я вставил код, но

console.log(powerMonitor.querySystemIdleTime()) он возвращает это сообщение об ошибке.
введите описание изображения здесь

Как я могу обнаружить бездействие системы и что-то сделать в электронном виде? Должен ли я использовать другую упаковку?

 import { app, dialog, Menu, Notification, Tray, ipcMain, powerMonitor } from 'electron'
import windowManager from 'electron-window-manager'
import schedule from 'node-schedule'

let mainWindow = null
let tray = null
if (process.env.NODE_ENV !== 'development') {
  global.__static = require('path').join(__dirname, '/static').replace(/\/g, '\\')
}
app.setAppUserModelId('Geomec Cloud Manager')
windowManager.init({
  appBase: process.env.NODE_ENV === 'production'
    ? `file://${__dirname}`
    : 'http://localhost:9080'
})
if (isSecondInstance) {
  app.quit()
} else {
  app.on('second-instance', () => {
    if (mainWindow) {
      mainWindow.object.show()
      mainWindow.object.focus()
    }
  })
  /* Main Window */
  app.on('ready', () => {
    mainWindow = windowManager.createNew('main-window', '', '/index.html', null, {
      title: 'Geomec Cloud Manager',
      height: 500,
      width: 500,
      useContentSize: true,
      frame: false,
      maximizable: false,
      minimizable: false,
      resizable: false
    }).create()
    console.log(powerMonitor.querySystemIdleTime()) // I thought it returns idle time
    if (!process.argv.includes('--systray')) {
      mainWindow.object.once('ready-to-show', () => {
        mainWindow.object.show()
      })
    }
    tray = new Tray(__static   '/tray-icon.ico')
    const trayMenu = Menu.buildFromTemplate([{
      label: '프로그램 정보',
      click () {
        const window = windowManager.createNew('about-window', '', '/index.html#about', null, {
          height: 380,
          width: 550,
          useContentSize: true,
          frame: false,
          maximizable: false,
          minimizable: false,
          resizable: false,
          modal: true,
          parent: windowManager.get('main-window').object
        }).create()
        window.object.once('ready-to-show', () => {
          window.object.show()
        })
      }
    },
    {
      /* Tray 내부 프로그램 종료 함수 */
      label: '프로그램 종료',
      click () {
        const notification = {
          icon: __static   '/'   'app-icon.png',
          title: '네트워크 드라이브 연결이 해제되었습니다',
          body: '프로그램을 종료합니다'
        }
        new Notification(notification).show()
        mainWindow.object.webContents.send('terminate-child-processes')
        ipcMain.on('child-processes-terminated', () => {
          setTimeout(function () {
            app.quit()
          }, 5000)
        })
      }
    }
    ])
    tray.setToolTip('Geomec Cloud Manager')
    tray.setContextMenu(trayMenu)
    tray.on('click', () => {
      mainWindow.object.show()
    })
  })
}


 

Ответ №1:

Согласно документам, вызов звучит так: powerMonitor.querySystemIdleTime(callback) и, как указано в сообщении об ошибке, вы не приводите необходимый аргумент.

Попробуйте изменить:

 console.log(powerMonitor.querySystemIdleTime())
 

Для:

 powerMonitor.querySystemIdleTime((idleSecs)=>{
  console.log(`The system has been idle for ${idleSecs} seconds.`)
  })
 

Исходя из вашего варианта использования, на самом деле powerMonitor.querySystemIdleState(idleThreshold, callback) вы захотите использовать его с idleThreshold установленным значением 30 * 60 .