|
|
办公软件WPS的表格:通过ExecuteExcel4Macro调用WinAPI实现
测试与调用函数:
- function 鼠标所指窗口信息(){ //显示句柄、标题、类
- let 窗口句柄=鼠标所指窗口句柄();
- let 窗口标题=获取窗口标题(窗口句柄);
- let 窗口类名=获取类名(窗口句柄);
- console.clear();
- console.log("窗口句柄:"+窗口句柄+"\n窗口标题:"+窗口标题+"\n窗口类名:"+窗口类名);
- }
- function 鼠标所指窗口句柄(){ //返回窗口句柄
- const 执行宏调用=ExecuteExcel4Macro;
- let 鼠标指针坐标=获取鼠标位置(); /*****调用函数*****/
- let 水平=鼠标指针坐标[0],垂直=鼠标指针坐标[1]; //鼠标指针处窗口句柄 //扩展了一个参数
- let 窗口句柄=执行宏调用(`CALL("User32", "WindowFromPoint", "JJJ", ${水平},${垂直})`);
- return 窗口句柄;
- }
- function 获取窗口标题(窗口句柄){
- const 执行宏调用=ExecuteExcel4Macro;
- let 窗口标题长度=执行宏调用(`CALL("User32", "GetWindowTextLengthA", "JJ", ${窗口句柄})`);
- let 缓冲区大小=窗口标题长度+1,窗口标题="";
- const 内存地址 = 执行宏调用(`CALL("Kernel32", "VirtualAlloc", "JJJJJ", 0, ${缓冲区大小}, ${0x3000}, 4)`); //申请内存
- let 标题长度=执行宏调用(`CALL("User32", "GetWindowTextA", "JJJJ", ${窗口句柄},${内存地址},${窗口标题长度+1})`);
- if(标题长度){窗口标题=内存读取字符串(内存地址);}
- 执行宏调用(`CALL("Kernel32", "VirtualFree", "JJJJ", ${内存地址}, 0, ${0x8000})`); //释放内存
- return 窗口标题;
- }
- function 获取类名(窗口句柄){
- const 执行宏调用=ExecuteExcel4Macro;
- let 缓冲区大小=256,类名=""; //类名最长255
- const 内存地址=执行宏调用(`CALL("Kernel32","VirtualAlloc","JJJJJ",0,${缓冲区大小},${0x3000},4)`); //申请内存
- let 类名长度=执行宏调用(`CALL("User32","GetClassNameA","JJJJ",${窗口句柄},${内存地址},${缓冲区大小})`);
- if(类名长度){类名=内存读取字符串(内存地址);}
- 执行宏调用(`CALL("Kernel32","VirtualFree","JJJJ",${内存地址},0,${0x8000})`); //释放内存
- return 类名;
- }
- function 获取鼠标位置(){ //返回坐标数组[x,y]
- const 执行宏调用=ExecuteExcel4Macro;
- var 坐标结构=执行宏调用(`CALL("User32","GetCursorPos","1E",0)`); //参数一:4+4字节坐标结构
- const 缓冲区=new ArrayBuffer(8); //8字节对应64位
- const 数据操作=new DataView(缓冲区); //操作对象
- 数据操作.setFloat64(0,坐标结构); //(操作)写入64位数
- let 坐标=[];
- 坐标[0]=数据操作.getInt32(4); //取32位坐标x
- 坐标[1]=数据操作.getInt32(0); //取32位坐标y
- return 坐标;
- }
- function 内存读取字符串(内存地址){ //返回字符串
- const 执行宏调用=ExecuteExcel4Macro,段长度=127;
- const 总字节=执行宏调用(`CALL("Kernel32","lstrlenA","JJ",${内存地址})`); //内存文本字节数
- let 偏移字节=0,文本字符串=分段文本='';
- while(偏移字节<总字节){ //返回字符串F。 //返回超255字节时,也需要分段操作
- 分段文本=执行宏调用(`CALL("Kernel32","lstrcpynW","FFJJ","",${内存地址+偏移字节},${段长度})`);
- 偏移字节+=分段文本.replace(/[^\x00-\xff]/g,'xx').length; //计算字符串字节数
- 文本字符串+=分段文本;
- }
- return 文本字符串;
- }
复制代码
验证参数可扩展!
|
|