Node ffi调用SHAppBarMessage获取任务栏位置返回错误RECT数据
问题根因
你遇到的返回值异常是结构体类型映射错误+内存对齐规则不匹配,导致Windows API无法识别你传入的APPBARDATA结构体,只填充了部分字段。你输出的cbSize=40就已经说明异常:64位Windows下合法的APPBARDATA结构体大小应为48字节,系统校验cbSize不通过,不会返回完整的任务栏位置数据。
具体错误点
- HWND类型映射错误
APPBARDATA的hWnd成员是HWND指针类型,64位下占8字节。你用ref.types.long定义该字段,而Windows平台C语言的long是32位(仅占4字节),导致后续所有成员的内存偏移全部错位。 - 结构体对齐规则不匹配
Windows API结构体默认采用8字节自然对齐,你没有显式指定对齐规则,ref-struct-di默认对齐逻辑会导致结构体大小计算错误,传入的cbSize不符合系统预期。 - LPARAM类型映射错误
lParam成员是LPARAM类型,属于指针宽度的整数,不应固定定义为int64,需用指针类型映射适配平台。
修复后代码
const ffi = require("ffi-napi"); const ref = require("ref-napi"); const Struct = require("ref-struct-di")(ref); const ABM_GETTASKBARPOS = 0x5; const ABEdgeBottom = 3; const RECT_Struct = Struct({ left: ref.types.long, top: ref.types.long, right: ref.types.long, bottom: ref.types.long, }); // 修正结构体类型和对齐规则 const APPBARDATA_Struct = Struct({ cbSize: ref.types.uint32, hWnd: ref.types.intPtr, // HWND对应指针类型 uCallbackMessage: ref.types.uint32, uEdge: ref.types.uint32, rc: RECT_Struct, lParam: ref.types.intPtr, // LPARAM对应指针宽度整数 }, { packed: 8 }); // 显式指定8字节对齐,匹配Windows API规则 const shell32 = ffi.Library("shell32.dll", { SHAppBarMessage: [ref.types.intPtr, [ref.types.int, ref.types.pointer]], }); const data = new APPBARDATA_Struct(); data.cbSize = APPBARDATA_Struct.size; // 64位环境下此处大小应为48 shell32.SHAppBarMessage(ABM_GETTASKBARPOS, data.ref()); console.log(`任务栏位置:${JSON.stringify(data.rc)}`);
验证说明
修复后再次运行,uEdge会返回正确的任务栏位置标识(底部任务栏返回3即ABEdgeBottom),rc字段会输出和Python/AHK一致的正确坐标。注册appbar无响应的问题也会因为结构体参数合法同步解决。
内容的提问来源于stack exchange,提问作者Elendiar
相关产品推荐
相关产品推荐

