141 lines
3.7 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

const { execFile } = require("child_process");
const { promisify } = require("util");
const fs = require("fs");
const path = require("path");
const os = require("os");
const { runCsharpFeature } = require("../../csharp");
const execFileAsync = promisify(execFile);
const readFileAsync = promisify(fs.readFile);
const unlinkAsync = promisify(fs.unlink);
// Windows 截图实现
async function captureWindowsScreen() {
const tmpFile = path.join(os.tmpdir(), `screen-${Date.now()}.png`);
try {
await runCsharpFeature("utils", ["-type", "screenshot", "-path", tmpFile]);
const imageBuffer = await readFileAsync(tmpFile);
return `data:image/png;base64,${imageBuffer.toString("base64")}`;
} catch (error) {
console.error("Windows截图失败:", error);
return null;
} finally {
await unlinkAsync(tmpFile).catch(() => {});
}
}
// macOS 截图实现
async function captureMacScreen() {
const tmpFile = path.join(os.tmpdir(), `screen-${Date.now()}.png`);
try {
await execFileAsync("screencapture", ["-x", "-C", "-T", "0", tmpFile]);
const imageBuffer = await readFileAsync(tmpFile);
return `data:image/png;base64,${imageBuffer.toString("base64")}`;
} catch (error) {
console.error("macOS截图失败:", error);
return null;
} finally {
await unlinkAsync(tmpFile).catch(() => {});
}
}
// Linux 截图实现
async function captureLinuxScreen() {
const tmpFile = path.join(os.tmpdir(), `screen-${Date.now()}.png`);
try {
// 检查可用的截图工具
let tool = null;
try {
await execFileAsync("which", ["gnome-screenshot"]);
tool = "gnome-screenshot";
} catch {
try {
await execFileAsync("which", ["scrot"]);
tool = "scrot";
} catch {
try {
await execFileAsync("which", ["import"]);
tool = "import";
} catch {
quickcommand.showSystemMessageBox(
"请先安装截图工具命令sudo apt install scrot"
);
return null;
}
}
}
// 根据可用工具执行截图
switch (tool) {
case "gnome-screenshot":
await execFileAsync("gnome-screenshot", ["-f", tmpFile]);
break;
case "scrot":
await execFileAsync("scrot", [tmpFile]);
break;
case "import":
await execFileAsync("import", ["-window", "root", tmpFile]);
break;
}
const imageBuffer = await readFileAsync(tmpFile);
return `data:image/png;base64,${imageBuffer.toString("base64")}`;
} catch (error) {
throw error;
} finally {
await unlinkAsync(tmpFile).catch(() => {});
}
}
// 统一的截图接口
async function captureFullScreen() {
if (process.platform === "darwin") {
return await captureMacScreen();
} else if (process.platform === "win32") {
return await captureWindowsScreen();
} else if (process.platform === "linux") {
return await captureLinuxScreen();
}
}
function captureAreaScreen() {
return new Promise((resolve) => {
window.utools.screenCapture((data) => {
resolve(data);
});
});
}
async function captureScreen(range = "fullscreen") {
return range === "fullscreen"
? await captureFullScreen()
: await captureAreaScreen();
}
async function captureScreenToFile(range = "fullscreen", path = null) {
if (!path) return;
const result = await captureScreen(range);
if (!result) return;
fs.writeFileSync(
path,
result.replace("data:image/png;base64,", ""),
"base64"
);
return;
}
async function captureScreenToClipboard(range = "fullscreen") {
const result = await captureScreen(range);
if (!result) return null;
window.utools.copyImage(result);
return result;
}
module.exports = {
captureScreen,
captureScreenToFile,
captureScreenToClipboard,
};