electron/docs/fiddles/media/screenshot/take-screenshot/main.js

57 lines
1.6 KiB
JavaScript

const { BrowserWindow, app, screen, ipcMain, desktopCapturer, shell } = require('electron/main')
const fs = require('node:fs').promises
const os = require('node:os')
const path = require('node:path')
let mainWindow = null
function determineScreenShotSize (devicePixelRatio) {
const screenSize = screen.getPrimaryDisplay().workAreaSize
const maxDimension = Math.max(screenSize.width, screenSize.height)
return {
width: maxDimension * devicePixelRatio,
height: maxDimension * devicePixelRatio
}
}
async function takeScreenshot (devicePixelRatio) {
const thumbSize = determineScreenShotSize(devicePixelRatio)
const options = { types: ['screen'], thumbnailSize: thumbSize }
const sources = await desktopCapturer.getSources(options)
for (const source of sources) {
const sourceName = source.name.toLowerCase()
if (sourceName === 'entire screen' || sourceName === 'screen 1') {
const screenshotPath = path.join(os.tmpdir(), 'screenshot.png')
await fs.writeFile(screenshotPath, source.thumbnail.toPNG())
shell.openExternal(`file://${screenshotPath}`)
return `Saved screenshot to: ${screenshotPath}`
}
}
}
ipcMain.handle('take-screenshot', (event, devicePixelRatio) => takeScreenshot(devicePixelRatio))
function createWindow () {
const windowOptions = {
width: 600,
height: 300,
title: 'Take a Screenshot',
webPreferences: {
preload: path.join(__dirname, 'preload.js')
}
}
mainWindow = new BrowserWindow(windowOptions)
mainWindow.loadFile('index.html')
mainWindow.on('closed', () => {
mainWindow = null
})
}
app.whenReady().then(() => {
createWindow()
})