ffi库是npm提供的操作windows系统库函数的依赖库,安装过程会比较麻烦,需要编译,可能需要npm全局安装windows-build-tools,如何安装,可以参照这里。
这篇博客内容,都是参照stackoverflow上的这篇文章得来,提问者提出问题,有回答者给出了解决方案,我也按照回答者思路做了一些尝试,得到本例代码。验证了回答者的答案,同时也学到了关于指针相关知识。
运行本次示例,需要安装ffi,ref,ref-struct等依赖。
npm install ffi ref ref-struct --save
这里根据user32提供的FindWindowW,GetWindowRect方法来获取桌面程序窗口大小,代码如下:
getwindowrect.js
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 rect = Struct({
left : 'long',
top : 'long',
right : 'long',
bottom : 'long'
});
var rectPtr = ref.refType(rect);
var user32 = ffi.Library('user32', {
FindWindowW: ['int', [lpctstr, lpctstr]],
SetForegroundWindow: ['bool', ['int']],
GetWindowRect: ['bool', ['long',rectPtr]]
});
var hwnd = user32.FindWindowW(null, 'QPST Configuration (pail-pc)');
user32.SetForegroundWindow(hwnd);
var Rect = new rect;
var bool = user32.GetWindowRect(hwnd, Rect['ref.buffer']);
console.log(bool,Rect);
运行程序,得到结果如下所示:
首先开启一个桌面程序,窗口宽度806,高度439:
打印的结果:
{ left: 6,
top: 6,
right: 826,
bottom: 452,
'ref.buffer':
<Buffer@0x0000022D95D0CB50 06 00 00 00 06 00 00 00 3a 03 00 00 c4 01 00 00> }
高度: bottom-top = 452-6 = 446
宽度: right - left = 826-6 = 820
因为是windows10系统,界面高度宽度与实际计算的结果有一些差异。
在调用GetWindowRect方法的时候,因为传入的参数除了窗口句柄hwnd之外,还需要的是一个RECT,有left,top,right,bottom四个属性,这里复杂的地方在于要构建一个RECT指针。
另外,也给出一个代码,稍微有些变化,但是也不是特别容易理解:
getwindowsize.js
var ffi = require('ffi');
function TEXT(text) {
return Buffer.from(`${text}\0`, "ucs2");
}
var user32 = new ffi.Library("user32", {
FindWindowW:["int32",["string","string"]],
GetWindowRect: ["bool", ["int32", "pointer"]],
SetForegroundWindow: ['bool', ['int32']],
});
function GetWindowPosition(handle) {
var rectPointer = Buffer.alloc(4 * 4);
var success = user32.GetWindowRect(handle, rectPointer);
if (!success) return null;
let rect = RectPointerToRect(rectPointer);
return rect;
}
function RectPointerToRect(rectPointer) {
let rect = {};
rect.left = rectPointer.readUInt32LE(0);
rect.top = rectPointer.readUInt32LE(4);
rect.right = rectPointer.readUInt32LE(8);
rect.bottom = rectPointer.readUInt32LE(12);
return rect;
}
var hwnd = user32.FindWindowW(null,TEXT("QPST Configuration (pail-pc)"));
user32.SetForegroundWindow(hwnd);
var size = GetWindowPosition(hwnd);
console.log(size);
运行代码,打印结果:
打印窗口大小结果和上一个代码是一样的。
第二段代码似乎更简单,他只用到了ffi库,但是理解起来似乎没有第一个那么好。尤其是获取结果的时候,进行了buffer转换。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)