ffi查找窗口句柄

第一种写法:

function u16ptr(s) {    
    const t = ffi.Buffer("u16string")    
    const b = new t()    
    b.write(s)    
    const v = new Uint32Array(b)    
    return FFI.BigIntToPointer(v[0])
}

function findWindowExample(){    
    const { FindWindowExW } = ffi.LoadLibrary("user32", {
    FindWindowExW: {  returnType: "uint32",parameters: [ "uint32", "uint32", "pointer", "pointer" ]}    
    })    
    console.log(FindWindowExW(0, 0, null, u16ptr("WPS 宏编辑器")))
}

第二种写法:

function findWindowExample() {	
let { FindWindowW } = ffi.LoadLibrary("user32", {	
    FindWindowW: {returnType: "uint32", parameters: ["pointer","pointer"]}	});		
let mtitle = "无标题 - Notepad";		
let mclass = "Notepad";		
let buft = strToArr(mtitle);	
let bufc = strToArr(mclass);	
let Hwnd = FindWindowW(bufc.buffer, buft.buffer);	
console.log(Hwnd);
}

function strToArr(str) {  
    const l = str.length;  
    const int16Arr = new Int16Array(l+2);  
    for (let i = 0; i < l; i++) {    
        int16Arr[i] = str.charCodeAt(i);  
    }  
    return int16Arr;
}

在jsaIDE环境下,winAPI函数尽量用W类型名称的。目前看,比A的好调用一些。

黑龙江省
浏览 96
1
2
分享
2 +1
11
1 +1
全部评论 11
 
初心不忘
我想查找某个程序窗口,是不是改下mclass就行了?
· 江苏省
回复
恰同学少年
mtitle和mclass都要改。可以用spy++获取这两个值。FindWindowW只能获取顶级窗口句柄。
· 黑龙江省
回复
 
wils
wils

创作者俱乐部成员

又有新的发现,在获取字符串指针这一步可以这样,优美多了 现在在想,导入方法时的参数能否直接接受一个联合类型,还没弄明白怎么写 function u16ptr(s) { const UnionType = ffi.Union([ { name: "u", type: "u16string"}, { name: "p", type: "pointer" }, ]) const t = new UnionType() t.u = "你好" return t.p }
· 海南省
1
回复
恰同学少年
官方例程中 new 后面没有括号,也能正常运行
· 黑龙江省
回复
 
叶定伟
· 安徽省
回复