关于electron中使用ffi-napi窗口遍历的过程及问题

使用环境:electorn19 、node16、ffi-napi、user32

前言:这里先提一嘴,windows api也是有32位和64位的区别的,因为我是要快速完成项目,就没用C++写(不熟练),我想着直接用易语言写DLL,但易语言从来就只有32位,也就是编译出来的DLL也是32位的,导致我的node也必须要跟着切到32位才能使用易语言编译出来的DLL,因此就有了现在这个问题。

问题开始:

在原先的项目中,我使用的是64位的user32,在这里我们通常会使用EnumWindows这个api去遍历当前打开的所有窗口,代码如下

javascript 复制代码
const enumWindows = (callback) => {
  user32.EnumWindows(ffi.Callback('bool', ['long', 'int32'], (hwnd, lParam) => {
    const win = new WindowInfo(hwnd);
    if (!callback(win)) {
      return false;
    }
    // 获取子窗口
    user32.EnumChildWindows(win.hwnd, ffi.Callback('bool', ['long', 'int32'], (childHwnd, lParam) => {
      console.log("childHwnd", childHwnd, lParam)
      const childWin = new WindowInfo(childHwnd);
      return callback(childWin);
    }), lParam);
  }), 0);
};

上方这样获取在node为64位的情况下是完全没有问题的,会返回所有的窗口句柄,但在32位的node中,他只会返回一个莫名奇妙的句柄,也并不是我需要的。所以在32位的node环境中我采取了GetWindow这个API,且成功返回所有窗口句柄(可以根据自己需要过滤)

javascript 复制代码
  const windows = [];
  const windowsHwnd = user32.GetDesktopWindow();
  console.log("windowsHwnd", windowsHwnd)

  let hwndTemp =  user32.GetWindow(windowsHwnd, 5)

  while (hwndTemp != 0) {
    // let className =  user32.getWindowClassName(hwndTemp);
    // console.log("className", className)
    windows.push(hwndTemp);
    hwndTemp = user32.GetWindow(hwndTemp, 2)
  }
  console.log("windows233243242", windows)
相关推荐
程序员鱼皮10 分钟前
Gemini 3.0 发布!
前端·ai编程·gemini
程序员鱼皮11 分钟前
Gemini 3.0 炸裂发布!前端又死了???
前端·ai·程序员·互联网·代码
xiangxiongfly91514 分钟前
CSS svg
前端·css·svg
山依尽24 分钟前
如何将一个 React SPA 项目迁移到 Next.js 服务端渲染
前端·next.js
28 分钟前
使用 svgfmt 优化 SVG 图标
前端·svg·icon
Watermelo61729 分钟前
href 和 src 有什么区别,它们对性能有什么影响?
前端·javascript·vue.js·性能优化·html·html5·用户体验
hqk38 分钟前
鸿蒙零基础语法入门:开启你的开发之旅
android·前端·harmonyos
AAA阿giao40 分钟前
大厂面试之反转字符串:深入解析与实战演练
前端·javascript·数据结构·面试·职场和发展·编程技巧
专业抄代码选手1 小时前
告别“屎山”:用 Husky + Prettier + ESLint 打造前端项目的代码基石
前端
想进字节冲啊冲1 小时前
Vibe Coding 实战指南:从“手写代码”到“意图设计”的前端范式转移
前端·ai编程