javascript - Node ffi Rect 类型

标签 javascript node.js user32 node-ffi

我想使用 node-ffi 和 user32 库在 Node 中获取特定窗口的大小。根本无法使 Rect 指针工作,我要么得到 NULL 作为输出,要么出现 fatal error 。

https://msdn.microsoft.com/en-us/library/windows/desktop/ms633503(v=vs.85).aspx

Out LPRECT lpRect 应包含左上角和右下角的坐标。

var ffi = require('ffi');
var ref = require('ref');
var Struct = require('ref-struct');

var lpctstr = {
    name: 'lpctstr',
    indirection: 1,
    size: ref.sizeof.pointer,
    get: function(buffer, offset) {
        var _buf = buffer.readPointer(offset);
        if(_buf.isNull()) {
            return null;
        }
        return _buf.readCString(0);
    },
    set: function(buffer, offset, value) {
        var _buf = ref.allocCString(value, 'ucs2');

        return buffer.writePointer(_buf, offset);
    },
    ffi_type: ffi.types.CString.ffi_type
};


var lpdwordPtr = ref.refType(ref.types.ulong);

var pointStruct = new Struct({
  'x': 'long',
  'y': 'long'
});

var rectStruct = new Struct({
  left        : pointStruct,
  top         : pointStruct,
  right       : pointStruct,
  bottom      : pointStruct
});

var rectPtr = ref.refType(rectStruct);


var user32 = ffi.Library('user32', {
    FindWindowW: ['int', [lpctstr, lpctstr]],
    GetWindowThreadProcessId: ['int', ['int', lpdwordPtr]],
    SetForegroundWindow: ['bool', ['int']],
    GetWindowRect: [rectPtr, ['int']]
});

var hwnd = user32.FindWindowW(null, 'Calculator');
user32.SetForegroundWindow(hwnd);
var Rect = user32.GetWindowRect(hwnd);
console.log(JSON.stringify(Rect));

最佳答案

我无法让您的示例使用 ref-struct 方法工作,但我想出了一种使用简单的“指针”类型来完成它的方法:

var user32 = new ffi.Library("user32", {
    GetWindowRect: ["bool", ["int32", "pointer"]],
});

export function GetWindowPosition(handle: number) {
    var rectPointer = Buffer.alloc(4 * 4);
    var success = user32.GetWindowRect(handle, rectPointer);
    if (!success) return null;

    let rect = RectPointerToRect(rectPointer);
    console.log("Rect: " + JSON.stringify(rect));
    return rect;
}

function RectPointerToRect(rectPointer: Buffer) {
    let rect = {} as any;
    rect.left = rectPointer.readUInt32LE(0);
    rect.top = rectPointer.readUInt32LE(4);
    rect.right = rectPointer.readUInt32LE(8);
    rect.bottom = rectPointer.readUInt32LE(12);
    return rect;
}

关于javascript - Node ffi Rect 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38038701/

相关文章:

javascript - 在 JS 设置中隐藏 API key

javascript - JQuery:单击单选按钮时更改类

javascript - 创建执行某些任务的包装器

c# - Windows 7 中的鼠标移动 - 左键单击并拖动

javascript - socket.io "connect"刷新/重新加载事件不会触发

javascript - 开发模式需要 GWT 开发者插件

javascript - 如何在 Node.js 中获取基于数组的目录列表

javascript - Mongoose 的回调()参数无效错误

java - 在Java窗口中嵌入c++ opengl窗口

c# - 有没有办法在 Windows 10 设备上以编程方式启用/禁用(灰色)操作中心中的旋转锁定,而无需重新启动?