|
|
办公软件WPS的表格:通过ExecuteExcel4Macro调用WinAPI实现
测试与调用函数: //打开记事本,输入内容
- function 找到记事本窗口键盘输入测试(){ //记事本编辑框中输入内容
- console.clear();
- const 执行宏调用=ExecuteExcel4Macro;
-
- let 记事本类="Notepad"; //找到那个打开的记事本窗口
- var 记事本句柄=执行宏调用(`CALL("User32","FindWindowA","JFJ","${记事本类}",0)`);
- console.log("记事本句柄:"+记事本句柄);
- if(!记事本句柄){
- let 记事本进程句柄=执行宏调用(`CALL("Shell32","ShellExecuteA","JJFFJJJ",0,"open","notepad",0,0,1)`);
- console.log("记事本进程句柄:"+记事本进程句柄);
- alert("等待,确定后向记事本写入信息");
- 记事本句柄=执行宏调用(`CALL("User32","FindWindowA","JFJ","${记事本类}",0)`);
- console.log("记事本句柄:"+记事本句柄);
- }
- 执行宏调用(`CALL("User32","SetForegroundWindow","JJ",${记事本句柄})`); //前置
-
- let 字符串="BatHome.Net"; //批处理之家论坛网址,作为填写内容
- let 字符数组=字符串.split(''),按键数组=[];
- for(let i=0;i<字符串.length;i++){
- var 字符=字符数组[i];
- if(字符>='a' && 字符<='z'){字符=字符.toUpperCase();}
- 按键数组[i]=键盘操作对象(字符);
- }
- 操作键盘(按键数组); /*****键盘操作*****/
- }
- 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 键盘操作对象(键码){
- 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.数据填充0 = [4,0] //都是4*7=28字节,不足部分补足
- }
- };
- if(键码>='A'&&键码<='Z'){键码=键码.charCodeAt(0);}
- if(键码=='.'){键码=0xBE;}
- let 键盘对象 = new 键盘操作(键码,4|2); //统一码0x4|2键弹起
- 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 数据写入内存(内存地址,数组缓冲,字节数){
- 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];
- }
- }
复制代码 |
|