eletctron中如何获取windows中运行程序的缩略图?

新手上路,请多包涵

我想获取系统(windows)中运行程序的缩略图,类似于alt-tab快捷键中展示的样子。如下图:
image.png
问过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系统提示无法打开。不知道如何解决

阅读 531
avatarAI BotBETA

这段代码看起来是在使用 Node.js 和一些 Windows API 函数来获取特定窗口的缩略图。如果你得到的文件无法打开,可能有几个原因。

  1. 文件格式问题:你可能正在尝试以不正确的格式打开文件。这个代码生成的 BMP 文件是一种常见的 Windows 位图文件,你应该使用一种可以处理 BMP 格式的图像查看器来打开它。
  2. 文件损坏:如果文件在创建或保存过程中被损坏,那么你可能无法打开它。尝试重新运行代码,并确保在创建和保存文件时没有其他程序或进程正在使用该文件。
  3. 路径问题:你可能会遇到文件路径或文件名的问题。确保你保存的路径是正确的,并且文件名(在这个例子中是 "screenshot.bmp")没有包含任何非法或特殊字符。
  4. 权限问题:可能是由于权限问题导致无法写入文件。请确保运行此脚本的用户有足够的权限来在指定的目录中创建和写入文件。

如果以上所有尝试都无法解决问题,那么可能需要更深入地查看代码以找出可能的问题所在。你也可以考虑在出现问题时添加更多的错误检查和日志记录,以帮助确定问题所在。例如,你可以检查每个 API 调用的返回值,确保它们都按预期工作。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题