|
|
办公软件WPS的表格:通过ExecuteExcel4Macro调用WinAPI实现
测试与调用函数:
- function 获取鼠标指针处窗口标题测试(){
- const 执行宏调用=ExecuteExcel4Macro;
-
- //鼠标指针坐标
- let 鼠标指针坐标=获取鼠标位置(); /*****获取鼠标指针坐标*****/
- let 水平=鼠标指针坐标[0],垂直=鼠标指针坐标[1];
- console.clear();
- console.log("鼠标当前位置:("+水平+","+垂直+")");
-
- //鼠标指针处窗口句柄 //扩展参数成功,增加了一个参数
- let 窗口句柄=执行宏调用(`CALL("User32", "WindowFromPoint", "JJJ", ${水平},${垂直})`);
- console.log("窗口句柄:"+窗口句柄);
-
- //获取窗口标题长度
- let 窗口标题长度=执行宏调用(`CALL("User32", "GetWindowTextLengthA", "JJ", ${窗口句柄})`);
- console.log("窗口标题长度:"+窗口标题长度);
-
- const 内存地址 = 执行宏调用(`CALL("Kernel32", "VirtualAlloc", "JJJJJ", 0, ${窗口标题长度+1}, ${0x3000}, 4)`);
- //获取窗口标题 //申请内存↑
- let 标题长度=执行宏调用(`CALL("User32", "GetWindowTextA", "JJJJ", ${窗口句柄},${内存地址},${窗口标题长度+1})`);
- let 窗口标题=内存读取字符串(内存地址); /*****获取内存文本*****/
- console.log("标题长度:"+标题长度+"\n窗口标题:"+窗口标题);
- let 标题数组缓冲=内存读取数据(内存地址,窗口标题长度+1); /*****读取数据*****/
- 显示数组缓冲(标题数组缓冲); /*****显示数据*****/
-
- 执行宏调用(`CALL("Kernel32", "VirtualFree", "JJJJ", ${内存地址}, 0, ${0x8000})`); //释放内存
- }
- function 获取鼠标位置(){ //返回坐标数组[x,y]
- const 执行宏调用=ExecuteExcel4Macro; //逻辑值 GetCursorPos([输出]结构 屏幕坐标指针)
- 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 文本字符串;
- }
- function 内存读取数据(内存地址,字节数){ //返回数组缓冲
- const 执行宏调用=ExecuteExcel4Macro;
- let 偏移,i,读取字节=[],读出数据;
- for(偏移=i=0;偏移<字节数;i++){
- if(字节数-偏移>=4){读取字节[i]=4;偏移+=4;}
- else{if(字节数-偏移>=2){读取字节[i]=2;偏移+=2;}
- else{if(字节数-偏移==1){读取字节[i]=1;偏移++;}}}
- }
- const 数组缓冲=new ArrayBuffer(字节数); //用于存储读出的数据
- const 数据操作=new DataView(数组缓冲);
- for(偏移=i=0;偏移<字节数;i++){ //库Kernel32.dll和NtDll.dll里都有RtlMoveMemory //读出
- 读出数据=执行宏调用(`CALL("Kernel32","RtlMoveMemory","1NJJ",${内存地址},${内存地址+偏移},${读取字节[i]})`);
- if(读取字节[i]==4){数据操作.setInt32(偏移,读出数据,true);偏移+=4;}
- else{if(读取字节[i]==2){数据操作.setInt16(偏移,读出数据,true);偏移+=2;}
- else{if(读取字节[i]==1){数据操作.setInt8(偏移,读出数据,true);偏移++;}}}
- }
- return 数组缓冲; //返回
- }
- function 显示数组缓冲(数组缓冲){
- const 数据操作=new DataView(数组缓冲);
- var 字节数码串=[],字符串=[],行号,四分隔,八分隔;
- for(let 偏移=0;偏移<数组缓冲.byteLength;偏移++){
- var 字节数码=数据操作.getInt8(偏移);
- 行号=Math.floor(偏移/16);
- if((偏移+1)%4){四分隔=''}else{四分隔=' '};
- if((偏移+1)%8){八分隔=''}else{八分隔=' '};
- if(typeof 字节数码串[行号]=="undefined"){字节数码串[行号]=''}
- var 字节高位=(字节数码>>>4&0xF).toString(16).toUpperCase(),字节低位=(字节数码&0xF).toString(16).toUpperCase();
- 字节数码串[行号]+=字节高位+字节低位+" "+四分隔+八分隔;
- if(typeof 字符串[行号]=="undefined"){字符串[行号]=''}
- if(字节数码){字符串[行号]+=String.fromCharCode(字节数码);}else{字符串[行号]+=' ';}
- }
- for(let 行号=0;行号<字节数码串.length;行号++){
- var 十六进制行号=('000'+(行号<<4).toString(16)).slice(-4).toUpperCase();
- console.log(十六进制行号+":"+字节数码串[行号]+"\t["+字符串[行号]+"]"); //显示输出
- }
- }
复制代码
验证参数可扩展! |
|