找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 58|回复: 1

[转载代码] 在办公软件WPS的JSA中模拟键盘输入

[复制链接]
发表于 昨天 23:12 | 显示全部楼层 |阅读模式
办公软件WPS的表格:通过ExecuteExcel4Macro调用WinAPI实现

测试与调用函数:        //打开记事本,输入内容
  1. function 找到记事本窗口键盘输入测试(){        //记事本编辑框中输入内容
  2.         console.clear();
  3.         const 执行宏调用=ExecuteExcel4Macro;
  4.        
  5.         let 记事本类="Notepad";        //找到那个打开的记事本窗口
  6.         var 记事本句柄=执行宏调用(`CALL("User32","FindWindowA","JFJ","${记事本类}",0)`);
  7.         console.log("记事本句柄:"+记事本句柄);
  8.         if(!记事本句柄){
  9.                 let 记事本进程句柄=执行宏调用(`CALL("Shell32","ShellExecuteA","JJFFJJJ",0,"open","notepad",0,0,1)`);
  10.                 console.log("记事本进程句柄:"+记事本进程句柄);
  11.                 alert("等待,确定后向记事本写入信息");
  12.                 记事本句柄=执行宏调用(`CALL("User32","FindWindowA","JFJ","${记事本类}",0)`);
  13.                 console.log("记事本句柄:"+记事本句柄);
  14.         }
  15.     执行宏调用(`CALL("User32","SetForegroundWindow","JJ",${记事本句柄})`);        //前置
  16.        
  17.         let 字符串="BatHome.Net";        //批处理之家论坛网址,作为填写内容
  18.         let 字符数组=字符串.split(''),按键数组=[];
  19.         for(let i=0;i<字符串.length;i++){
  20.                 var 字符=字符数组[i];
  21.                 if(字符>='a' && 字符<='z'){字符=字符.toUpperCase();}
  22.                 按键数组[i]=键盘操作对象(字符);
  23.         }
  24.         操作键盘(按键数组);        /*****键盘操作*****/
  25. }

  26. function 操作键盘(操作数组){
  27.         let 序号=0,键盘数组=[];
  28.         if(Array.isArray(操作数组)){
  29.                 for(let i=0;i<操作数组.length;i++){
  30.                         if(Array.isArray(操作数组[i])){
  31.                                 for(let j=0;j<操作数组[i].length;j++){
  32.                                         键盘数组[序号]=操作数组[i][j];序号++;
  33.                                 }
  34.                         }else{键盘数组[序号]=操作数组[i];序号++;}
  35.                 }
  36.         }else{键盘数组[序号]=操作数组;}
  37.         let 操作组数=键盘数组.length;
  38.         let 结构字节数=对象字节数(键盘数组[0]);        /*****计算结构对象字节数*****/
  39.         let 总字节=结构字节数*操作组数;
  40.        
  41.         const 数组缓冲=new ArrayBuffer(总字节);        //操作对象数组写入缓冲
  42.         for(let i=0;i<操作组数;i++){
  43.                 结构对象填入数组缓冲(数组缓冲,i*结构字节数,键盘数组[i]);        /*****对象转数组缓冲*****/
  44.         }
  45.         const 执行宏调用=ExecuteExcel4Macro;        //申请内存
  46.         const 内存地址=执行宏调用(`CALL("Kernel32","VirtualAlloc","JJJJJ",0,${总字节},${0x3000},4)`);
  47.         数据写入内存(内存地址,数组缓冲,总字节);        /*****写入键盘操作结构*****/        //执行键盘操作
  48.         键盘操作结果=执行宏调用(`CALL("User32","SendInput","JJJJ",${操作组数},${内存地址},${结构字节数})`);
  49.         if(!键盘操作结果){console.log("错误代码:"+执行宏调用(`CALL("Kernel32","GetLastError","I")`));}
  50.         执行宏调用(`CALL("Kernel32", "VirtualFree", "JJJJ", ${内存地址}, 0, ${0x8000})`);        //释放内存
  51. }
  52. function 键盘操作对象(键码){
  53.         class 键盘操作 {        //类
  54.                 constructor(按键,动作){        //类的构造方法,用于构造属性
  55.                         this.输入类型1 = [4,1],        //键盘1        //字节数,数据
  56.                         this.虚拟键码2 = [4,按键],        //同ASCII码
  57.                         this.键扫描码3 = [4,0],
  58.                         this.输入操作4 = [4,动作],        //按键弹起2        启用扫描码8
  59.                         this.时间戳值5 = [4,0],        //系统确定
  60.                         this.扩展信息6 = [4,0],
  61.                         this.数据填充0 = [4,0]        //都是4*7=28字节,不足部分补足
  62.                 }
  63.         };
  64.         if(键码>='A'&&键码<='Z'){键码=键码.charCodeAt(0);}
  65.         if(键码=='.'){键码=0xBE;}
  66.         let 键盘对象 = new 键盘操作(键码,4|2);        //统一码0x4|2键弹起
  67.         return 键盘对象;
  68. }
  69. function 对象字节数(结构对象){
  70.         let 对象数据字节数=0;
  71.         for (let 属性名 in 结构对象) {
  72.                 if (结构对象.hasOwnProperty(属性名)) {
  73.                         对象数据字节数+=结构对象[属性名][0];        //累加字节数
  74.                 }
  75.         }
  76.         return 对象数据字节数;
  77. }
  78. function 结构对象填入数组缓冲(数组缓冲,偏移,结构对象){
  79.         const 数据操作=new DataView(数组缓冲);
  80.         let 字节数,待填数据;
  81.         for (let 属性名 in 结构对象) {
  82.                 if (结构对象.hasOwnProperty(属性名)) {
  83.                         字节数=结构对象[属性名][0],待填数据=结构对象[属性名][1];
  84.                         if(字节数==4){数据操作.setInt32(偏移,待填数据,true);}        //小端序
  85.                         else{if(字节数==2){数据操作.setInt32(偏移,待填数据,true);}
  86.                         else{if(字节数==1){数据操作.setInt32(偏移,待填数据,true);}}}
  87.                         偏移+=字节数;
  88.                 }
  89.         }
  90. }
  91. function 数据写入内存(内存地址,数组缓冲,字节数){
  92.         const 数据操作=new DataView(数组缓冲);
  93.         let 偏移=i=0,待写数据=[],写入字节=[];
  94.         while(字节数>偏移){
  95.                 if(字节数-偏移>=4){待写数据[i]=数据操作.getInt32(偏移,true);写入字节[i]=4;i++;偏移+=4;}
  96.                 else{if(字节数-偏移>=2){待写数据[i]=数据操作.getInt16(偏移,true);写入字节[i]=2;i++;偏移+=2;}
  97.                 else{if(字节数-偏移==1){待写数据[i]=数据操作.getInt8(偏移,true);写入字节[i]=1;i++;偏移++;}}}
  98.         }
  99.         const 执行宏调用=ExecuteExcel4Macro;
  100.         for(偏移=i=0;i<写入字节.length;i++){        //写入
  101.                 执行宏调用(`CALL("Kernel32","RtlMoveMemory","2JNJ",${内存地址+偏移},${待写数据[i]},${写入字节[i]})`);
  102.                 偏移+=写入字节[i];
  103.         }
  104. }
复制代码
 楼主| 发表于 8 小时前 | 显示全部楼层
通过SendMessage向文本编辑区填入内容:
  1. function 记事本窗口发送文本测试(){        //记事本编辑框中内容
  2.         console.clear();
  3.         const 执行宏调用=ExecuteExcel4Macro;
  4.         
  5.         //找到打开的记事本窗口,没有则打开一个新记事本
  6.         let 记事本类="Notepad";
  7.         var 记事本句柄=执行宏调用(`CALL("User32","FindWindowA","JFJ","${记事本类}",0)`);
  8.         console.log("记事本句柄:"+记事本句柄);
  9.         if(!记事本句柄){
  10.                 let 记事本进程句柄=执行宏调用(`CALL("Shell32","ShellExecuteA","JJFFJJJ",0,"open","notepad",0,0,1)`);
  11.                 console.log("记事本进程句柄:"+记事本进程句柄);
  12.                 alert("等待,确定后向记事本写入信息");        //弹窗提示
  13.                 记事本句柄=执行宏调用(`CALL("User32","FindWindowA","JFJ","${记事本类}",0)`);
  14.                 console.log("记事本句柄:"+记事本句柄);
  15.         }
  16.             执行宏调用(`CALL("User32","SetForegroundWindow","JJ",${记事本句柄})`);        //前置
  17.         
  18.         //定位到记事本的编辑输入区
  19.         let 编辑框类="Edit";
  20.         let 编辑框句柄=执行宏调用(`CALL("User32","FindWindowExA","JJJFJ",${记事本句柄},0,"${编辑框类}",0)`);
  21.         
  22.         //通过发送消息,向记事本写入文本
  23.         let 设置文本=0xC,字符串="BatHome.Net";        //批处理之家论坛网址,作为内容
  24.         var 设置文本框内容=执行宏调用(`CALL("User32", "SendMessageA", "JJJJF", ${编辑框句柄},${设置文本},0,"${字符串}")`);
  25. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-4-27 19:57

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表