我想获取系统(windows)中运行程序的缩略图,类似于alt-tab快捷键中展示的样子。如下图:
问过chatgpt,提供了如下代码:
const ffi = require("ffi-napi");
const ref = require("ref-napi");
const ArrayType = require("ref-array-napi");
const fs = require("fs");
// 定义 Windows API 函数和数据类型
const user32 = new ffi.Library("user32", {
GetWindowRect: ["bool", ["long", "pointer"]],
GetDC: ["long", ["long"]],
ReleaseDC: ["int", ["long", "long"]],
GetDesktopWindow: ["int", []],
});
const gdi32 = new ffi.Library("gdi32", {
CreateCompatibleDC: ["long", ["long"]],
CreateCompatibleBitmap: ["long", ["long", "int", "int"]],
SelectObject: ["long", ["long", "long"]],
BitBlt: [
"int",
["long", "int", "int", "int", "int", "long", "int", "int", "int"],
],
GetObjectA: ["int", ["long", "int", "pointer"]],
GetDIBits: [
"int",
["long", "long", "uint", "uint", "pointer", "pointer", "uint"],
],
DeleteDC: ["bool", ["long"]],
DeleteObject: ["bool", ["long"]],
});
// 找到目标窗口的句柄
const windowHandle = 395014; // 替换为你要获取的窗口句柄
// 获取窗口的矩形区域
const rect = Buffer.alloc(16);
user32.GetWindowRect(windowHandle, rect);
// 计算窗口的宽度和高度
const left = rect.readInt32LE(0);
const top = rect.readInt32LE(4);
const right = rect.readInt32LE(8);
const bottom = rect.readInt32LE(12);
const width = right - left;
const height = bottom - top;
// 获取桌面窗口的设备上下文(DC)
const desktopWindow = user32.GetDesktopWindow();
const hdcDesktop = user32.GetDC(desktopWindow);
try {
// 创建兼容的设备上下文(DC)和位图
const hdcMem = gdi32.CreateCompatibleDC(hdcDesktop);
const hBitmap = gdi32.CreateCompatibleBitmap(hdcDesktop, width, height);
gdi32.SelectObject(hdcMem, hBitmap);
// 使用 BitBlt 函数将窗口的内容复制到位图
gdi32.BitBlt(hdcMem, 0, 0, width, height, hdcDesktop, left, top, 0x00cc0020); // CAPTUREBLT | SRCCOPY
// 获取位图信息
const buffer = Buffer.alloc(width * height * 4); // 假设位图是 32 位颜色
const bmpInfo = ref.alloc("char", 40); // sizeof(BITMAPINFO) == 40
gdi32.GetObjectA(hBitmap, 40, bmpInfo);
// 获取位图数据
gdi32.GetDIBits(hdcDesktop, hBitmap, 0, height, buffer, bmpInfo, 0);
// 在这里,buffer 包含窗口的缩略图数据
console.log(buffer, "buffer");
fs.writeFileSync("screenshot.bmp", buffer);
// 释放资源
gdi32.DeleteDC(hdcMem);
gdi32.DeleteObject(hBitmap);
user32.ReleaseDC(desktopWindow, hdcDesktop);
} catch (e) {
console.warn(e);
}
buffer 存储的文件screenshot.bmp
系统提示无法打开。不知道如何解决