2016-12-19 6 views
0

Код ссылки: https://github.com/aredfox/screencapturerElectron UI BrowserWindow замерзает Основные BrowserWindow

Описание проблемы: Here является electron приложение с "MainWindow", который содержит кнопку "Пуск" захват. После щелчка он запускает событие для основного процесса, затем основной процесс запускает новый отдельный объект «BrowserWindow» с именем «captureWindow» с его собственными привязанными capture.html и capture.js. В capture.js каждые три секунды выполняется скриншот и сохраняется в c: \ temp \ screencap (это демонстрационное приложение, чтобы проиллюстрировать проблему, поэтому я не сделал этот настраиваемый и жестко закодированный путь на данный момент). Каждый раз, когда происходит захват в «craptureWindow», он зависает, чего я ожидал. Но объект «mainWindow» также замерзает, чего я не ожидал от него. Как мне обращаться с этим, так что mainWindow не замерзает, когда процесс запускается в другом объекте «BrowserWindow»? Я предположил, что у браузера Internet BrowserWindows (или «tabs») была отдельная нить?


EDIT 20/12/2016 Возможный виновник desktopCapturer.getSources().

ADDENDUM: обнаружено, что проблема должна быть внутри кодового блока getMainSource, потому что, когда я кэширую этот «исходный» результат, он не замораживает весь электрон. Таким образом, должно быть, что метод фильтра или получение самого экрана вызывает проблему замораживания.

function getMainSource(desktopCapturer, screen, done) { 
    const options = { 
     types: ['screen'], thumbnailSize: screen.getPrimaryDisplay().workAreaSize 
    } 
    desktopCapturer.getSources(options, (err, sources) => { 
     if (err) return console.log('Cannot capture screen: ', err) 

     const isMainSource = source => source.name === 'Entire screen' || source.name === 'Screen 1' 
     done(sources.filter(isMainSource)[0]) 
    }) 
} 

Решения, хотя не кэшировать результат getMainSource (так называемого «источник»), так как это приведет к тем же данным изображений каждый раз, конечно. Я подтвердил, что, записывая файл в формате png, и, действительно, каждый скриншот тогда был тем же самым, даже если на рабочем столе было достаточно. TODO: Возможная опция - настроить видеопоток и сохранить изображение из потока?

ответ

0

Если вы хотите захватить скриншоты кросс-платформу, я бы посоветовал использовать подход ниже, вместо того чтобы полагаться на встроенный электрон-api. Не то чтобы они не были хороши, но они не подходят для скриншотов каждые три секунды, например.

Решение для меня было npm-модулем desktop-screenshot - и пакетом npm под названием hazardous, поскольку это было необходимо для Windows & asar.

Код, который я в конечном итоге выполнил, был этим - это может быть источником вдохновения/примера для вашей проблемы.

/* ******************************************************************** */ 
/* MODULE IMPORTS */ 
import { remote, nativeImage } from 'electron'; 
import path from 'path'; 
import os from 'os'; 
import { exec } from 'child_process'; 
import moment from 'moment'; 
import screenshot from 'desktop-screenshot'; 
/* */ 
/*/********************************************************************/// 

/* ******************************************************************** */ 
/* CLASS */ 
export default class ScreenshotTaker {  
    constructor() { 
     this.name = "ScreenshotTaker";   
    } 

    start(cb) { 
     const fileName = `cap_${moment().format('YYYYMMDD_HHmmss')}.png`; 
     const destFolder = global.config.app('capture.screenshots'); 
     const outputPath = path.join(destFolder, fileName);   
     const platform = os.platform(); 
     if(platform === 'win32') { 
      this.performWindowsCapture(cb, outputPath); 
     } 
     if(platform === 'darwin') { 
      this.performMacOSCapture(cb, outputPath); 
     } 
     if(platform === 'linux') { 
      this.performLinuxCapture(cb, outputPath); 
     } 
    } 

    performLinuxCapture(cb, outputPath) { 
     // debian 
     exec(`import -window root "${outputPath}"`, (error, stdout, stderr) => { 
      if(error) { 
       cb(error, null, outputPath); 
      } else { 
       cb(null, stdout, outputPath); 
      } 
     }); 
    } 
    performMacOSCapture(cb, outputPath) { 
     this.performWindowsCapture(cb, outputPath); 
    } 
    performWindowsCapture(cb, outputPath) { 
     require('hazardous'); 
     screenshot(outputPath, (err, complete) => { 
      if(err) { 
       cb(err, null, outputPath); 
      } else { 
       cb(null, complete, outputPath); 
      } 
     }); 
    } 
} 
/*/********************************************************************///