|
|
找到窗口,模拟键盘输入数字编码
- function 超量多码(){
- console.clear();
- var 剪贴板文本=获取剪贴板文本(); //编辑取自剪贴板
- var 数字串=剪贴板文本.replace(/[^\d^,]+/g,','); //非数字替换成分隔符
- var 数串数组=数字串.split(','),除重对象={},数码="",计数=0; //数组:六位除重
- for(var 序号=0;序号<数串数组.length;序号++){
- if(数串数组[序号].length==6 && typeof 除重对象[数串数组[序号]]=='undefined'){
- 除重对象[数串数组[序号]]=1;计数++;数码+=数串数组[序号]+',';
- }
- }
- console.log("编码:"+数码); //数码即编码数组。
- if(数码=='' || 数码==','){alert("编码为空!退出……");return;} //空串,即没有编码
-
- let 标题="多品种商品选择",类="FNWNS3100";
- let 选择窗口句柄=查找窗口(标题,类);
- if(!选择窗口句柄){alert("未找到超量多码输入窗口,退出!");return;}
-
- let 自身窗口句柄=获取活动窗口句柄(); //最小化自身,方便输入编码
- 窗口最小化(自身窗口句柄);
- 前置窗口(选择窗口句柄);延时(300);
- let 添加按钮标题='添加(&A)',按钮类='Button';
- let 添加按钮句柄=下一个子窗口(选择窗口句柄,0,添加按钮标题,0);
- let 按钮范围=获取窗口范围(添加按钮句柄);
- var 按钮水平=按钮范围[0],按钮垂直=按钮范围[1];
-
- let 编码框中水平=按钮水平-136,编码框中垂直=按钮垂直+12; //添加按钮相对编码框距离
- 设置鼠标位置(编码框中水平,编码框中垂直);
- 鼠标点击(); //光标定位编码框中
-
- let 编码组=数码.split(',');
- for(let i=0;i<编码组.length;i++){
- if(编码组[i]!=""){
- 模拟键盘输入编码(编码组[i]); //输入编码
- 模拟键盘回车(); //回车确定
- 延时(800); //处理弹出对话框或窗口:一、已存在;二、错误;三、不全需要选择。
- let 错误对话框句柄=查找对话框窗口("错误"); //输入编码不存在
- if(错误对话框句柄){延时(200);
- let 确定按钮=下一个子窗口(错误对话框句柄,0,"确定",0);
- 发送点击按钮消息(确定按钮);
- }
- let 提示对话框句柄=查找对话框窗口("提示"); //重复,编码已在列表中
- if(提示对话框句柄){延时(200);
- let 确定按钮=下一个子窗口(提示对话框句柄,0,"确定",0);
- 发送点击按钮消息(确定按钮);
- } //还有一个列表选择窗未处理
- }
- }
- 延时(300); //恢复窗口显示
- let 恢复结果=恢复窗口(自身窗口句柄);
- }
- function 获取剪贴板文本(){ //返回字符串
- let 内存地址,剪贴板文本="",执行宏调用=ExecuteExcel4Macro;
- if(执行宏调用(`CALL("user32.dll","OpenClipboard","JJ",0)`)){ //打开剪贴板
- const 内存句柄=执行宏调用(`CALL("user32.dll","GetClipboardData","JJ",1)`); //获取剪贴板文本,返回句柄。
- if(内存句柄){ //锁定全局内存对象,获取内存地址
- 内存地址=执行宏调用(`CALL("kernel32.dll","GlobalLock","JJ",${内存句柄})`);
- let 总字节,偏移字节=0,段长度=127,分段文本='';
- 总字节=执行宏调用(`CALL("Kernel32","lstrlenA","JJ",${内存地址})`); //剪贴板文本字节数
- while(偏移字节<总字节){ //返回字符串F。返回值超255字节时,也需要分段操作
- 分段文本=执行宏调用(`CALL("Kernel32","lstrcpynW","FFJJ","",${内存地址+偏移字节},${段长度})`);
- 偏移字节+=分段文本.replace(/[^\x00-\xff]/g,'xx').length; //计算分段文本字节数
- 剪贴板文本+=分段文本;
- }
- 执行宏调用(`CALL("kernel32.dll","GlobalUnlock","JJ",${内存句柄})`); //解锁
- }else{console.log("未能获取剪贴板数据的内存句柄!");}
- 执行宏调用(`CALL("user32.dll","CloseClipboard","J")`); //关闭剪贴板,让其它应用可以使用剪贴板
- return 剪贴板文本; //返回字符串
- }else{alert('无法打开剪贴板!');}
- }
- function 查找窗口(标题,类){ //返回句柄
- const 执行宏调用=ExecuteExcel4Macro;
- var 窗口句柄;
- if(!标题){ //标题为0
- if(!类){ 窗口句柄=执行宏调用(`CALL("User32","FindWindowA","JJJ",0,0)`); //类为0
- }else{ 窗口句柄=执行宏调用(`CALL("User32","FindWindowA","JFJ","${类}",0)`);}
- }else{
- if(!类){ 窗口句柄=执行宏调用(`CALL("User32","FindWindowA","JJF",0,"${标题}")`); //类为0
- }else{ 窗口句柄=执行宏调用(`CALL("User32","FindWindowA","JFF","${类}","${标题}")`);}
- }
- return 窗口句柄;
- }
- function 获取活动窗口句柄(){ //进程所在自身窗口
- const 执行宏调用=ExecuteExcel4Macro;
- let 自身窗口句柄=执行宏调用(`CALL("User32","GetActiveWindow","J")`);
- return 自身窗口句柄;
- }
- function 前置窗口(窗口句柄){
- const 执行宏调用=ExecuteExcel4Macro;
- let 前置结果=执行宏调用(`CALL("User32","SetForegroundWindow","JJ",${窗口句柄})`);
- return 前置结果;
- }
- function 窗口最小化(窗口句柄){let 激活最小化=2;return 显示窗口(窗口句柄,激活最小化);}
- function 恢复窗口(窗口句柄){let 恢复=9;return 显示窗口(窗口句柄,恢复);}
- function 显示窗口(窗口句柄,显示标识){ //普通显示=1,显示=5,激活最小化=2,最小化=6,恢复=9;
- const 执行宏调用=ExecuteExcel4Macro;
- let 显示结果=执行宏调用(`CALL("User32","ShowWindow","AJJ",${窗口句柄},${显示标识})`);
- return 显示结果;
- }
- function 延时(毫秒数){
- const 执行宏调用=ExecuteExcel4Macro;
- 执行宏调用(`CALL("Kernel32","Sleep","JJ",${毫秒数})`);
- }
- function 下一个子窗口(父句柄,上个子句柄,标题,类){
- const 执行宏调用=ExecuteExcel4Macro;
- var 子句柄;
- if(!标题){ //标题为0
- if(!类){ 子句柄=执行宏调用(`CALL("User32","FindWindowExA","JJJJJ",${父句柄},${上个子句柄},0,0)`); //类为0
- }else{ 子句柄=执行宏调用(`CALL("User32","FindWindowExA","JJJFJ",${父句柄},${上个子句柄},"${类}",0)`);}
- }else{
- if(!类){ 子句柄=执行宏调用(`CALL("User32","FindWindowExA","JJJJF",${父句柄},${上个子句柄},0,"${标题}")`); //类为0
- }else{ 子句柄=执行宏调用(`CALL("User32","FindWindowExA","JJJFF",${父句柄},${上个子句柄},"${类}","${标题}")`);}
- }
- return 子句柄;
- }
- function 获取窗口范围(窗口句柄){ //返回坐标数组:左上右下
- const 执行宏调用=ExecuteExcel4Macro;
- let 内存地址=申请虚拟内存(16); //===申请内存===//
- let 结果=执行宏调用(`CALL("User32","GetWindowRect","JJJ",${窗口句柄},${内存地址})`);
- let 数组缓冲=内存读取数据(内存地址,16); //===读取数据===/
- 释放虚拟内存(内存地址); //===释放内存===//
- let 坐标数组=缓冲转数组(数组缓冲); //===转数组===//
- return 坐标数组;
- }
- function 申请虚拟内存(字节数){ //返回内存地址
- const 执行宏调用=ExecuteExcel4Macro;
- const 内存地址=执行宏调用(`CALL("Kernel32","VirtualAlloc","JJJJJ",0,${字节数},${0x3000},4)`);
- return 内存地址;
- }
- function 释放虚拟内存(内存地址){
- const 执行宏调用=ExecuteExcel4Macro;
- 执行宏调用(`CALL("Kernel32","VirtualFree","JJJJ",${内存地址},0,${0x8000})`);
- }
- 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;
- var 定位结果=执行宏调用(`CALL("User32","SetCursorPos","AJJ",${水平},${垂直})`);
- return 定位结果; //成功返回true
- }
- function 鼠标单击(){鼠标事件(6);}
- function 鼠标点击(){鼠标事件(6);}
- function 鼠标双击(){鼠标单击();鼠标点击();}
- function 鼠标右击(){鼠标事件(0x18);}
- function 鼠标事件(动作){
- const 执行宏调用=ExecuteExcel4Macro;
- 执行宏调用(`CALL("User32","mouse_event","JJJJJJ",${动作},0,0,0,0)`);
- }
- function 模拟键盘输入编码(编码串){ //六位数字编码串,可能有0开头的字符串
- for(let i=0;i<编码串.length;i++){
- let 数字码=编码串[i];
- 小键盘输入单个数字(数字码);
- }
- }
- function 模拟键盘回车(){let 回车码=0xD;模拟键盘按键(回车码);}
- function 模拟键盘按键(按键码){
- let 扫描码=按键码转扫描码(按键码);let 按下=0,松开=2;
- 键盘事件(按键码,扫描码,按下);键盘事件(按键码,扫描码,松开);
- }
- function 小键盘输入单个数字(数字){ //单个数字0~9
- let 小键盘数字码;
- if(typeof 数字=='number'){小键盘数字码=0x60+数字;}else{
- if(typeof 数字=="string"){小键盘数字码=0x30+数字.charCodeAt(0);}}
- let 小键盘数字扫描码=按键码转扫描码(小键盘数字码);
- let 按下=0,松开=2;
- 键盘事件(小键盘数字码,小键盘数字扫描码,按下);
- 键盘事件(小键盘数字码,小键盘数字扫描码,松开);
- }
- function 按键码转扫描码(按键码){ //返回扫描码
- const 执行宏调用=ExecuteExcel4Macro;
- let 扫描码=执行宏调用(`CALL("User32","MapVirtualKeyA","JJJ",${按键码},0)`);
- return 扫描码;
- }
- function 键盘事件(虚拟键码,扫描键码,键标志){
- const 执行宏调用=ExecuteExcel4Macro; //扫描码只需要低位,高位0xE0省略 //扩展键才用扫描码
- 执行宏调用(`CALL("User32","keybd_event","JJJJJ",${虚拟键码},${扫描键码},${键标志},0)`);
- }
- function 查找对话框窗口(标题){
- var 对话框句柄=查找窗口(标题,"#32770"); //对话框类#32770
- return 对话框句柄;
- }
- function 发送点击按钮消息(按钮句柄){var 点击=0xF5;发送消息(按钮句柄,点击);}
- function 发送关闭窗口消息(窗口句柄){var 关闭=0x10;发送消息(窗口句柄,关闭);}
- function 发送消息(窗口句柄,消息){ //等待结果返回
- const 执行宏调用=ExecuteExcel4Macro;
- 执行宏调用(`CALL("User32","SendMessageA","JJJJJ",${窗口句柄},${消息},0,0)`);
- }
复制代码 |
|