当前位置: 首页 > 知识库问答 >
问题:

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

丁翊歌
2023-10-19

我想获取系统(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系统提示无法打开。不知道如何解决

共有1个答案

常明亮
2023-10-19

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

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

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

 类似资料:
  • 问题内容: 我正在尝试在一个名为hello.js的单独文件中运行用javascript编写的hello world程序 当前正在运行Windows版本的node.js。 该代码可以在控制台窗口中完美运行,但是 如何在Windows环境中引用该路径 。 在Unix中,我猜它显示的是$ node hello.js 我绝对不是Node.js的新手,如果我做错了什么,请纠正我。 我试过了 -—没工作 -没

  • 问题内容: 我正在使用node.js构建应用程序,我已成功上传了视频,但需要为其生成视频缩略图。目前,我使用node exec执行ffmpeg的系统命令来制作缩略图。 此代码来自http://net.tutsplus.com/tutorials/javascript-ajax/how-to-create-a- resumable-video-uploade-in-node- js/中 的教程 上面

  • 问题内容: 有一个旧的应用程序,使用可以打印出很多消息,但是我只是找不到在哪个文件和行中调用。 有没有办法挂接到应用程序并显示文件名和行号? 问题答案: 对于临时黑客来说,找到想要摆脱的日志语句,覆盖自己并不是很困难。 那将打印类似 那里有很多杂音,但调用堆栈的第二行,应该将您指向正确的位置。

  • 问题内容: 在Windows资源管理器(和Linux gnome)中,为每个文件显示一个缩略图或 图标 。像EXE,图像,视频,txt文件,ini文件,Word文档以及许多其他文件类型一样。现在是我的问题:有没有一种方法可以通过文件获取(最好是较大的)图标。 就像是: 谢谢 问题答案: 似乎没有实现此操作的AWT方法。 如果您使用的是Swing,则可以使用一种方法来获取Swing … … 您还可以

  • 我在jsf中学习一个网络共享项目。在这个项目中,用户可以上传文档,如. doc、. pdf、. ppt等。我想将该文档的第一页显示为缩略图。经过一番谷歌搜索,我找到了Apache POI。有人对我的问题有什么建议吗?我如何返回word doc第一页的缩略图图像?我尝试了这段代码。这段代码只得到word doc包含的第一张图片:

  • 我有一个大尺寸的图像。在运行时,我想从存储器中读取图像,并对其进行缩放,以减少其重量和大小,并将其用作缩略图。当用户单击缩略图时,我想显示全尺寸的图像。