节点ffi Recttypes

我想要使​​用node-ffi和user32库在节点中获取特定窗口的大小。 无法使Rect指针工作,我得到NULL作为输出或致命的错误。

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

LPRECT lpRect应该包含左上angular和右下angular的坐标。

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)); 

尝试这个。 我相信,你已经为RECT做了四个POINT,但只需要LONG。

 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);