57 lines
1.6 KiB
JavaScript
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()
|
|
})
|