如何在本机函数中使用Electronjs函数“ getNativeWindowHandle()”的返回“缓冲区”?

时间:2019-05-05 16:44:31

标签: windows electron

我使用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的结果?

1 个答案:

答案 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))