4

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

3 に答える 3

1

これを試して。RECT で 4 つの 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);
于 2016-11-22T04:44:50.373 に答える