2016-06-26 3 views
2

node-ffi 및 user32 라이브러리를 사용하여 노드에 특정 창의 크기를 가져 오려고합니다. Rect 포인터가 전혀 작동하지 않을 수 있습니다. 출력이 NULL이거나 치명적인 오류가 발생합니다.node ffi Rect 유형

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

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

답변

0

시도해보십시오. 나는 네가 RECT를 위해 네 개의 포인트를 만들었지 만 그것은 오랫동안 필요하다고 믿는다.

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