|
|
办公软件WPS的表格:通过ExecuteExcel4Macro调用WinAPI实现
函数:
- function 操作键盘(操作数组){
- let 序号=0,键盘数组=[];
- if(Array.isArray(操作数组)){
- for(let i=0;i<操作数组.length;i++){
- if(Array.isArray(操作数组[i])){
- for(let j=0;j<操作数组[i].length;j++){
- 键盘数组[序号]=操作数组[i][j];序号++;
- }
- }else{键盘数组[序号]=操作数组[i];序号++;}
- }
- }else{键盘数组[序号]=操作数组;}
- let 操作组数=键盘数组.length;
- let 结构字节数=对象字节数(键盘数组[0]); /*****计算结构对象字节数*****/
- let 总字节=结构字节数*操作组数;
- const 数组缓冲=new ArrayBuffer(总字节); //操作对象数组写入缓冲
- for(let i=0;i<操作组数;i++){
- 结构对象填入数组缓冲(数组缓冲,i*结构字节数,键盘数组[i]); /*****对象转数组缓冲*****/
- }
- const 执行宏调用=ExecuteExcel4Macro; //申请内存
- const 内存地址=执行宏调用(`CALL("Kernel32","VirtualAlloc","JJJJJ",0,${总字节},${0x3000},4)`);
- 数据写入内存(内存地址,数组缓冲,总字节); /*****写入键盘操作结构*****/ //执行键盘操作
- 键盘操作结果=执行宏调用(`CALL("User32","SendInput","JJJJ",${操作组数},${内存地址},${结构字节数})`);
- if(!键盘操作结果){console.log("错误代码:"+执行宏调用(`CALL("Kernel32","GetLastError","I")`));}
- 执行宏调用(`CALL("Kernel32", "VirtualFree", "JJJJ", ${内存地址}, 0, ${0x8000})`); //释放内存
- }
复制代码
测试:键盘输入测试(); //执行函数前,请先打开一个记事本,将鼠标指针停在记事本窗口上方
测试及调用函数:
- function 键盘输入测试(){
- //执行函数前,请先打开一个记事本,将鼠标指针停在记事本窗口上方
- let 点击=鼠标操作对象(2|4);
- 操作鼠标([点击]); /*****鼠标单击操作*****/
- let 字符串="WuYou.Net"; //无忧论坛,将网址输入到记事本
- let 字符数组=字符串.split(''),按键数组=[];
- for(let i=0;i<字符串.length;i++){
- var 字符=字符数组[i];
- if(字符>='a' && 字符<='z'){字符=字符.toUpperCase();}
- 按键数组[i]=键盘操作对象(字符);
- }
- 操作键盘(按键数组); /*****键盘操作*****/
- }
- function 键盘操作对象(键码){
- class 键盘操作 { //类
- constructor(按键,动作){ //类的构造方法,用于构造属性
- this.输入类型1 = [4,1], //键盘1 //字节数,数据
- this.虚拟键码2 = [4,按键], //同ASCII码
- this.键扫描码3 = [4,0],
- this.输入操作4 = [4,动作], //按键弹起2 启用扫描码8
- this.时间戳值5 = [4,0], //系统确定
- this.扩展信息6 = [4,0],
- this.数据填充x = [4,0] //都是4*7=28字节,不足部分补足
- }
- };
- if(键码>='A'&&键码<='Z'){键码=键码.charCodeAt(0);}
- if(键码=='.'){键码=0xBE;}
- let 键盘对象 = new 键盘操作(键码,4|2); //统一码0x4|2键弹起
- return 键盘对象;
- }
- function 鼠标操作对象(操作){
- class 鼠标操作 { //类
- constructor(动作){ //类的构造方法,用于构造属性
- this.输入类型1 = [4,0], //鼠标0 //字节数,数据
- this.水平坐标2 = [4,0], //相对坐标,即移动量
- this.垂直坐标3 = [4,0],
- this.滚轮转量4 = [4,0],
- this.输入操作5 = [4,动作], //右键按下8 绝对坐标0x8000
- this.时间戳值6 = [4,0], //系统确定
- this.扩展数据7 = [4,0]
- }
- };
- let 鼠标对象 = new 鼠标操作(操作);
- return 鼠标对象;
- }
- function 对象字节数(结构对象){
- let 对象数据字节数=0;
- for (let 属性名 in 结构对象) {
- if (结构对象.hasOwnProperty(属性名)) {
- 对象数据字节数+=结构对象[属性名][0]; //累加字节数
- }
- }
- return 对象数据字节数;
- }
- function 结构对象填入数组缓冲(数组缓冲,偏移,结构对象){
- const 数据操作=new DataView(数组缓冲);
- let 字节数,待填数据;
- for (let 属性名 in 结构对象) {
- if (结构对象.hasOwnProperty(属性名)) {
- 字节数=结构对象[属性名][0],待填数据=结构对象[属性名][1];
- if(字节数==4){数据操作.setInt32(偏移,待填数据,true);} //小端序
- else{if(字节数==2){数据操作.setInt32(偏移,待填数据,true);}
- else{if(字节数==1){数据操作.setInt32(偏移,待填数据,true);}}}
- 偏移+=字节数;
- }
- }
- }
- function 操作鼠标(操作数组){
- let 操作组数=操作数组.length;
- let 结构字节数=对象字节数(操作数组[0]); /*****计算结构对象字节数*****/
- let 总字节=结构字节数*操作组数;
- const 数组缓冲=new ArrayBuffer(总字节); //操作对象数组写入缓冲
- for(let i=0;i<操作组数;i++){
- 结构对象填入数组缓冲(数组缓冲,i*结构字节数,操作数组[i]); /*****对象转数组缓冲*****/
- }
- const 执行宏调用=ExecuteExcel4Macro; //申请内存
- const 内存地址=执行宏调用(`CALL("Kernel32","VirtualAlloc","JJJJJ",0,${总字节},${0x3000},4)`);
- 数据写入内存(内存地址,数组缓冲,总字节); /*****写入鼠标操作结构*****/ //执行鼠标操作
- 鼠标操作结果=执行宏调用(`CALL("User32","SendInput","JJJJ",${操作组数},${内存地址},${结构字节数})`);
- if(!鼠标操作结果){console.log("错误代码:"+执行宏调用(`CALL("Kernel32","GetLastError","I")`));}
- 执行宏调用(`CALL("Kernel32", "VirtualFree", "JJJJ", ${内存地址}, 0, ${0x8000})`); //释放内存
- }
- function 数据写入内存(内存地址,数组缓冲,字节数){
- const 数据操作=new DataView(数组缓冲);
- let 偏移=i=0,待写数据=[],写入字节=[];
- while(字节数>偏移){
- if(字节数-偏移>=4){待写数据[i]=数据操作.getInt32(偏移,true);写入字节[i]=4;i++;偏移+=4;}
- else{if(字节数-偏移>=2){待写数据[i]=数据操作.getInt16(偏移,true);写入字节[i]=2;i++;偏移+=2;}
- else{if(字节数-偏移==1){待写数据[i]=数据操作.getInt8(偏移,true);写入字节[i]=1;i++;偏移++;}}}
- }
- const 执行宏调用=ExecuteExcel4Macro;
- for(偏移=i=0;i<写入字节.length;i++){ //写入
- 执行宏调用(`CALL("Kernel32","RtlMoveMemory","2JNJ",${内存地址+偏移},${待写数据[i]},${写入字节[i]})`);
- 偏移+=写入字节[i];
- }
- }
复制代码
数据结构类似鼠标操作。
|
|