|
|
增加文本编辑框内容的识别,类为Edit
- function 寻根开枝叶测试(){ //找到根顺枝到叶
- let 窗口句柄=鼠标所指窗口句柄();
- console.clear();
- while(窗口句柄){ //收藏
- var 句柄=窗口句柄;
- let 窗口信息=获取窗口信息(窗口句柄);
- 窗口信息显示(窗口信息,"","窗口");
- 窗口句柄=父窗口(窗口句柄);
- }
- const 根句柄=句柄,根序=1;
- console.log("\t["+根序+"]根句柄:"+根句柄);
- //生长
- let 枝句柄=根句柄;
- 子弟窗口(枝句柄,0,根序,0);
- }
- function 父窗口(窗口句柄){ //返回父窗口句柄
- const 执行宏调用=ExecuteExcel4Macro;
- 父句柄=执行宏调用(`CALL("User32","GetParent","JJ",${窗口句柄})`);
- return 父句柄;
- }
- function 子弟窗口(父句柄,兄句柄,父祖序,兄弟序){ //显示窗口信息树
- let 子句柄=下个子窗口(父句柄,兄句柄);
- while(子句柄){
- 兄弟序++;let 传承=父祖序+'.'+兄弟序;
- let 子窗口信息=获取窗口信息(子句柄);
- 窗口信息显示(子窗口信息,"["+传承+"]","");
- 子弟窗口(子句柄,0,传承,0); //---回溯---//
- 子句柄=下个子窗口(父句柄,子句柄);
- }
- }
- function 下个子窗口(父句柄,兄句柄){return 下一个子窗口(父句柄,兄句柄,0,0);}
- function 下一个子窗口(父句柄,上个子句柄,标题,类){
- const 执行宏调用=ExecuteExcel4Macro;
- var 子句柄;
- if(!标题){ //标题为0
- if(!类){ //类为0
- 子句柄=执行宏调用(`CALL("User32","FindWindowExA","JJJJJ",${父句柄},${上个子句柄},0,0)`);
- }else{
- 子句柄=执行宏调用(`CALL("User32","FindWindowExA","JJJFJ",${父句柄},${上个子句柄},"${类}",0)`);
- }
- }else{
- if(!类){ //类为0
- 子句柄=执行宏调用(`CALL("User32","FindWindowExA","JJJJF",${父句柄},${上个子句柄},0,"${标题}")`);
- }else{
- 子句柄=执行宏调用(`CALL("User32","FindWindowExA","JJJFF",${父句柄},${上个子句柄},"${类}","${标题}")`);
- }
- }
- return 子句柄;
- }
- function 鼠标所指窗口句柄(){ //返回窗口句柄
- const 执行宏调用=ExecuteExcel4Macro;
- let 鼠标指针坐标=获取鼠标位置(); //===调用函数===/
- let 水平=鼠标指针坐标[0],垂直=鼠标指针坐标[1]; //鼠标指针处窗口句柄 //扩展了一个参数
- let 窗口句柄=执行宏调用(`CALL("User32", "WindowFromPoint", "JJJ", ${水平},${垂直})`);
- 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 获取窗口信息(窗口句柄){ //返回数组[句柄,标题,类,坐标]
- let 窗口标题=获取窗口标题(窗口句柄);
- let 窗口类名=获取窗口类名(窗口句柄);
- let 窗口内容=获取窗口内容(窗口句柄);
- let 窗口坐标=获取窗口坐标(窗口句柄);
- return [窗口句柄,窗口标题,窗口类名,窗口内容,窗口坐标];
- }
- function 窗口信息显示(窗口信息,目录,说明){ //句柄、标题、类、坐标
- let 窗口句柄=窗口信息[0],窗口标题=窗口信息[1];
- let 窗口类名=窗口信息[2],编辑文本=窗口信息[3],窗口坐标=窗口信息[4];
- console.log(目录+说明+"句柄:"+窗口句柄+"\t"+说明+"标题:"+窗口标题+"\t"+说明+"类名:"+窗口类名+"\t"+说明+"内容:"+编辑文本+"\t"+说明+"坐标:"+窗口坐标);
- }
- 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 获取窗口内容(编辑框句柄){ //一般为编辑文本框,类:Edit
- const 执行宏调用=ExecuteExcel4Macro;
- let 编辑框内容="",获取文本长度=0xE,获取文本=0xD; //消息含义
- var 内容长度=执行宏调用(`CALL("User32", "SendMessageA", "JJJJJ", ${编辑框句柄},${获取文本长度},0,0)`);
- if(内容长度){
- let 缓冲区大小=内容长度+1;
- const 内存地址=执行宏调用(`CALL("Kernel32","VirtualAlloc","JJJJJ",0,${缓冲区大小},${0x3000},4)`); //申请内存
- var 获取结果=执行宏调用(`CALL("User32", "SendMessageA", "JJJJJ", ${编辑框句柄},${获取文本},${内容长度+1},${内存地址})`);
- 编辑框内容=内存读取字符串(内存地址);
- 执行宏调用(`CALL("Kernel32","VirtualFree","JJJJ",${内存地址},0,${0x8000})`); //释放内存
- }
- return 编辑框内容;
- }
- function 获取窗口坐标(窗口句柄){ //返回坐标数组:左上右下
- const 执行宏调用=ExecuteExcel4Macro;
- let 内存地址=申请虚拟内存(16);
- let 结果=执行宏调用(`CALL("User32","GetWindowRect","JJJ",${窗口句柄},${内存地址})`);
- let 数组缓冲=内存读取数据(内存地址,16);
- 释放虚拟内存(内存地址);
- let 坐标数组=缓冲转数组(数组缓冲);
- 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 缓冲转数组(数组缓冲){ //返回数组[]
- let 总字节=数组缓冲.byteLength;
- let 组数=Math.ceil(总字节/4);
- const 数据操作=new DataView(数组缓冲);
- let 数组=[];
- for(let i=0;i<组数;i++){
- 数组[i]=数据操作.getInt32(i*4,true);
- }
- return 数组;
- }
- function 申请虚拟内存(字节数){ //返回内存地址
- const 执行宏调用=ExecuteExcel4Macro;
- const 内存地址=执行宏调用(`CALL("Kernel32","VirtualAlloc","JJJJJ",0,${字节数},${0x3000},4)`);
- return 内存地址;
- }
- function 释放虚拟内存(内存地址){
- const 执行宏调用=ExecuteExcel4Macro;
- 执行宏调用(`CALL("Kernel32","VirtualFree","JJJJ",${内存地址},0,${0x8000})`);
- }
复制代码
|
|