关于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)
相关推荐
幽络源小助理几秒前
幽络源二次元分享地址发布页源码(HTML) – 源码网免费分享
前端·html
全栈前端老曹4 分钟前
【ReactNative】页面跳转与参数传递 - navigate、push 方法详解
前端·javascript·react native·react.js·页面跳转·移动端开发·页面导航
用泥种荷花1 小时前
【前端学习AI】Python环境搭建
前端
老华带你飞1 小时前
考试管理系统|基于java+ vue考试管理系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot·后端
_Kayo_1 小时前
React上绑定全局方法
前端·javascript·react.js
愈努力俞幸运1 小时前
chrome 扩展(插件)开发入门教程
前端·chrome
练习前端两年半1 小时前
【Vue3 高级技巧】函数重载+Watch:打造类型安全的通用事件监听 Hook
前端·javascript·vue.js
一只小鸟儿2 小时前
门户短信发送验证码及验证功能
前端·javascript·jquery
elangyipi1232 小时前
pnpm :下一代包管理工具的原理与实践
前端·npm
代码的奴隶(艾伦·耶格尔)2 小时前
Sentinel限流熔断
java·前端·sentinel