|
|
楼主 |
发表于 2026-5-4 16:59:21
|
显示全部楼层
模拟键盘输入文字:Alt + 内码
批处理:Alt+50682,Alt+46246,Alt+49389
- 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("记事本句柄:"+记事本句柄);
- }
-
- //字符串写入内存,再按数据方式读取出来(即内码)
- 字符串="批处理之家 BatHome.Net";
- let 内存句柄=字符串到内存(字符串); //===写字符串===//
- let 读出字符串=内存取字符串(内存句柄);
- console.log(读出字符串);
- let 数据数组缓冲=内存取数据(内存句柄); //===读取数据===//
- 显示数组缓冲(数据数组缓冲); //===显示数据===//
- 执行宏调用(`CALL("Kernel32","GlobalFree","JJ",${内存句柄})`); //释放内存
- let 文字内码=数组缓冲转文字内码数组(数据数组缓冲);
- console.log("文字内码数组:"+文字内码);
-
- //模拟键盘按键,向记事本写入文本
- 执行宏调用(`CALL("User32","SetForegroundWindow","JJ",${记事本句柄})`); //前置记事本窗口
- for(let i=0;i<文字内码.length;i++){
- 组合数码键入对应文字(文字内码[i]);
- } //光标放在此处:
- }
- function 数组缓冲转文字内码数组(数组缓冲){ //返回数组
- const 总字节=数组缓冲.byteLength;
- const 数据操作=new DataView(数组缓冲);
- let 偏移=0,文字内码=[];
- while(偏移<总字节){
- var 文字数码=数据操作.getUint8(偏移,true),偏移增量=1;
- if(!文字数码){break;}
- else{if(文字数码>0x80){文字数码=数据操作.getUint16(偏移),偏移增量=2;}}
- 文字内码.push(文字数码);
- 偏移+=偏移增量;
- }
- return 文字内码;
- }
- function 组合数码键入对应文字(数字码){ //数字码为内码
- let 数字串=数字码.toString(); //转数字字符串
- let 按下=0,松开=2,长修码=0x12;
- 键盘事件(长修码,0,按下); //按下键Alt
- for(let i=0;i<数字串.length;i++){
- let 数字=数字串[i];
- let 小键盘数字码=0x30+数字.charCodeAt(0);
- let 小键盘数字扫描码=按键码转扫描码(小键盘数字码);
- 键盘事件(小键盘数字码,小键盘数字扫描码,按下);
- 键盘事件(小键盘数字码,小键盘数字扫描码,松开);
- }
- 键盘事件(长修码,0,松开); //松开键Alt
- }
- function 键盘事件(虚拟键码,扫描键码,键标志){
- const 执行宏调用=ExecuteExcel4Macro; //扩展时扫描码只需要低位,高位0xE0省略 //扩展键小键盘数字会用到扫描码
- 执行宏调用(`CALL("User32","keybd_event","JJJJJ",${虚拟键码},${扫描键码},${键标志},0)`);
- }
- function 按键码转扫描码(按键码){ //返回扫描码
- const 执行宏调用=ExecuteExcel4Macro;
- let 扫描码=执行宏调用(`CALL("User32","MapVirtualKeyA","JJJ",${按键码},0)`);
- return 扫描码;
- }
- function 字符串到内存(字符串){ //返回内存句柄
- const 执行宏调用=ExecuteExcel4Macro;
- let 分段文本=[],分段字节=[],总字节=0,段长度=127; //可申请256字节内存,结束符1字节,汉字最长127
- for(let 起始=i=0;起始<字符串.length;起始+=段长度,i++){
- 分段文本.push(字符串.slice(起始,起始+段长度));
- 分段字节.push(分段文本[i].replace(/[^\x00-\xff]/g,'xx').length); //一个汉字占两个字节
- 总字节+=分段字节[i];
- } //分配内存 //分配GlobalAlloc对应销毁GlobalFree //分配GlobalAlloc对应销毁GlobalFree
- const 内存句柄=执行宏调用(`CALL("Kernel32","GlobalAlloc","JJJ",${0x42},${总字节+1})`);
- if(内存句柄){ //内存分配成功,然后锁写解内存。 //锁定全局内存对象,会返回其内存地址
- const 内存地址=执行宏调用(`CALL("Kernel32","GlobalLock","JJ",${内存句柄})`);
- for(let 偏移字节=i=0;i<分段文本.length;i++){ //字符串(JS变量)分批复制到刚申请的内存中。分批是因为有限长
- 执行宏调用(`CALL("Kernel32","lstrcpynW","JJFJ",${内存地址+偏移字节},"${分段文本[i].replace(/\"/g,'\"\"')}",${分段字节[i]})`);
- 偏移字节+=分段字节[i]; //返回地址J。 //字符串两个双引号解释成一个
- }
- 执行宏调用(`CALL("Kernel32","GlobalUnlock","JJ",${内存句柄})`); //解锁全局内存对象,以释放资源
- return 内存句柄;
- }else{console.log("未能分配内存!");}
- }
- function 内存取字符串(内存句柄){ //返回字符串
- const 执行宏调用=ExecuteExcel4Macro,段长度=127;
- const 内存地址=执行宏调用(`CALL("Kernel32","GlobalLock","JJ",${内存句柄})`); //锁定,获取内存地址
- if(内存地址){
- const 总字节=执行宏调用(`CALL("Kernel32","lstrlenA","JJ",${内存地址})`); //内存文本字节数
- let 偏移字节=0,文本字符串=分段文本='';
- while(偏移字节<总字节){ //返回字符串F。 //返回超255字节时,也需要分段操作
- 分段文本=执行宏调用(`CALL("Kernel32","lstrcpynW","FFJJ","",${内存地址+偏移字节},${段长度})`);
- //偏移字节+=分段文本.replace(/[^\x00-\xff]/g,'xx').length; //计算字符串字节数
- 偏移字节+=执行宏调用(`LENB("${分段文本.replace(/"/g,'x')}")`);
- 文本字符串+=分段文本;
- } //解锁全局内存对象,以释放资源
- 执行宏调用(`CALL("Kernel32","GlobalUnlock","JJ",${内存句柄})`);
- return 文本字符串;
- }else{console.log("未找到内存地址!");}
- }
- function 内存取数据(内存句柄){ //返回数组缓冲
- const 执行宏调用=ExecuteExcel4Macro;
- const 总字节=执行宏调用(`CALL("Kernel32","GlobalSize","JJ",${内存句柄})`); //内存对象空间大小
- 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(数组缓冲);
- const 内存地址=执行宏调用(`CALL("Kernel32","GlobalLock","JJ",${内存句柄})`);
- if(内存地址){ //var 文本=执行宏调用(`CALL("Kernel32","lstrcpynW","FFJJ","",${内存地址},${127})`);
- 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);偏移++;}}}
- }
- 执行宏调用(`CALL("Kernel32","GlobalUnlock","JJ",${内存句柄})`); //解锁内存对象,以释放资源
- return 数组缓冲; //返回
- }else{console.log("未找到内存地址!");}
- }
- 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["+字符串[行号]+"]");
- }
- }
复制代码 |
|