gpt4 book ai didi

javascript - Node ffi Rect 类型

转载 作者:搜寻专家 更新时间:2023-10-31 23:52:39 32 4
gpt4 key购买 nike

我想使用 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/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com