本文主要是介绍关于electron中使用ffi-napi窗口遍历的过程及问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
使用环境:electorn19 、node16、ffi-napi、user32
前言:这里先提一嘴,windows api也是有32位和64位的区别的,因为我是要快速完成项目,就没用C++写(不熟练),我想着直接用易语言写DLL,但易语言从来就只有32位,也就是编译出来的DLL也是32位的,导致我的node也必须要跟着切到32位才能使用易语言编译出来的DLL,因此就有了现在这个问题。
问题开始:
在原先的项目中,我使用的是64位的user32,在这里我们通常会使用EnumWindows这个api去遍历当前打开的所有窗口,代码如下
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,且成功返回所有窗口句柄(可以根据自己需要过滤)
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)
这篇关于关于electron中使用ffi-napi窗口遍历的过程及问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!