2016-06-26 6 views
2

node-ffiおよびuser32ライブラリを使用して、ノード内の特定のウィンドウサイズを取得したいとします。 Rectポインタをまったく動作させることはできません。出力としてNULLを取得しているか、致命的なエラーが発生しています。 LPRECT lpRectは、左上、および右下隅の座標が含まれている必要がありアウトnode ffi Rect型

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

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

答えて

0

これを試してください。私はあなたがRECTのための4つのポイントを作ったと信じますが、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);