我使用electronicjs函数getNativeWindowHandle()
查找电子主窗口的HWND。
即一个日志是:<Buffer@0x00000293A66F0450 ec 02 07 00 00 00 00 00>
转换为十六进制:ec02070000000000
但是真正的HWND是:459500
,是通过
handleElectron.substring(0, 6).match(/.{1,2}/g)
,先获取字符串的前三对,然后
newhandle = handleElectron[2] + handleElectron[1] + handleElectron[0];
,因为手柄的第一拳头两个字符和第三个拳头两个字符颠倒了。
然后我用parseInt(handleElectron, 16) << 8) / 256
来获取小数点
做同样的结果:user32.FindWindowW(TEXT('Chrome_WidgetWin_1'), null);
(通过node-ffi的本机函数),
但是我需要将其放入while循环中,因为FindWindowW
有时会给出0。
是否有一种更干净正确的方法来转换getNativeWindowHandle()
或任何其他本机函数可用的HWND中的FindWindowW
的结果?
答案 0 :(得分:1)
以下代码返回您要查找的整数值:
const os = require("os")
function getNativeWindowHandle_Int(win) {
let hbuf = win.getNativeWindowHandle()
if (os.endianness() == "LE") {
return hbuf.readInt32LE()
}
else {
return hbuf.readInt32BE()
}
}
可以肯定地说Windows是Little-Endian,但是代码仍然使用Node的os.endianness()
检查字节序。关于仅读取32位,Microsoft的documentation说:
在32位和64位应用程序之间共享句柄时,只有低32位有效,因此可以安全地截断该句柄(将其从64位传递到32位时)[..]
按如下方式在BrowserWindow上调用函数:
let myWin = new BrowserWindow()
console.log(getNativeWindowHandle_Int(myWin))