我希望使用节点-ffi和user32库在节点中获得特定窗口的大小。无法使Rect指针工作,我要么获得NULL作为输出,要么获得致命错误。
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));发布于 2019-07-13 15:05:15
我无法让您的示例使用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;
}发布于 2019-10-16 12:28:07
我有点晚了,但我想我终于弄明白了GetWindowRect()是如何工作的。
首先,您需要根据文档定义Rect结构
const rect = Struct({
left : 'long',
top : 'long',
right : 'long',
bottom : 'long',
});然后您需要定义您的user32库:
//I think This is something like (struct rect *)
//because you need to path pointer of struct rect to this function
const rectPtr = ref.refType(rect);
var user32 = ffi.Library('user32.dll', {
GetForegroundWindow : ['long',[]],
GetWindowRect : ['bool',['long',rectPtr]]
});在调用GetWindowRect之前,有必要获取您想知道的窗口的句柄。为了简单起见,我们只需使用当前活动的窗口,只需调用GetForegroundWindow函数:
const wind_handle = user32.GetForegroundWindow();我们有一个窗口句柄,现在我们需要为GetWindowRect()创建实际的result来存储结果:
const rec_struct = new rect;如果您将此对象记录在控制台中,您将看到如下所示:
{左: 0,顶部: 0,右: 0,底部: 0,“参”缓冲区: Buffer@0x000001C387A81E80 0000 00000000000000000000000000000000000000000000000000000000000000}
正如我前面提到的,GetWindowRect接受缓冲区作为它的第二个参数,并用实际的C矩形结构的内容来设置它的内容。因此,要在我们的rec_struct对象中获取窗口信息,我们需要将rec_struct‘re.Buffer’路径路径到GetWindowRect:
user32.GetWindowRect(fhwnd,rec['ref.buffer']);现在,如果您在控制台中记录rec_struct,您将看到它填充了窗口左上角和右下角的坐标:
{左: 560,顶部: 220,右: 1360,底部: 820,“参”:Buffer@0x0000012F3751F270 30 02 00 dc 00 00 00 50 05 00 00 34 03 00 }
现在,窗口大小的计算将是微不足道的。
发布于 2016-11-22 04:44:50
尝尝这个。我相信,你已经提出了四点建议,但它只需要很长时间。
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 = Struct({
'x': ffi.types.ulong,
'y': ffi.types.ulong
});
var rectStruct = Struct({
left : ffi.types.ulong,
top : ffi.types.ulong,
right : ffi.types.ulong,
bottom : ffi.types.ulong
});
var rectPtr = ref.refType(rectStruct);
var user32 = ffi.Library('user32', {
FindWindowW: ['int', [lpctstr, lpctstr]],
GetWindowThreadProcessId: ['int', ['int', lpdwordPtr]],
SetForegroundWindow: ['bool', ['int']],
GetWindowRect: ['bool', ['int',rectStruct]]
});
var hwnd = user32.FindWindowW(null, 'E');
user32.SetForegroundWindow(hwnd);
var Rect = new rectStruct;
var bool = user32.GetWindowRect(hwnd, Rect);
console.log(JSON.stringify(Rect), Rect);https://stackoverflow.com/questions/38038701
复制相似问题