找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 59|回复: 4

办公软件WPS的JSA获取鼠标指向窗口的标题

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

测试与调用函数:
  1. function 鼠标所指窗口信息(){        //显示句柄、标题、类
  2.         let 窗口句柄=鼠标所指窗口句柄();
  3.         let 窗口标题=获取窗口标题(窗口句柄);
  4.         let 窗口类名=获取类名(窗口句柄);
  5.         console.clear();
  6.         console.log("窗口句柄:"+窗口句柄+"\n窗口标题:"+窗口标题+"\n窗口类名:"+窗口类名);
  7. }

  8. function 鼠标所指窗口句柄(){        //返回窗口句柄
  9.         const 执行宏调用=ExecuteExcel4Macro;
  10.         let 鼠标指针坐标=获取鼠标位置();        /*****调用函数*****/
  11.         let 水平=鼠标指针坐标[0],垂直=鼠标指针坐标[1];        //鼠标指针处窗口句柄        //扩展了一个参数
  12.         let 窗口句柄=执行宏调用(`CALL("User32", "WindowFromPoint", "JJJ", ${水平},${垂直})`);
  13.         return 窗口句柄;
  14. }
  15. function 获取窗口标题(窗口句柄){
  16.         const 执行宏调用=ExecuteExcel4Macro;
  17.         let 窗口标题长度=执行宏调用(`CALL("User32", "GetWindowTextLengthA", "JJ", ${窗口句柄})`);
  18.         let 缓冲区大小=窗口标题长度+1,窗口标题="";
  19.         const 内存地址 = 执行宏调用(`CALL("Kernel32", "VirtualAlloc", "JJJJJ", 0, ${缓冲区大小}, ${0x3000}, 4)`);        //申请内存
  20.         let 标题长度=执行宏调用(`CALL("User32", "GetWindowTextA", "JJJJ", ${窗口句柄},${内存地址},${窗口标题长度+1})`);
  21.         if(标题长度){窗口标题=内存读取字符串(内存地址);}
  22.         执行宏调用(`CALL("Kernel32", "VirtualFree", "JJJJ", ${内存地址}, 0, ${0x8000})`);        //释放内存
  23.         return 窗口标题;
  24. }
  25. function 获取类名(窗口句柄){
  26.         const 执行宏调用=ExecuteExcel4Macro;
  27.         let 缓冲区大小=256,类名="";        //类名最长255
  28.         const 内存地址=执行宏调用(`CALL("Kernel32","VirtualAlloc","JJJJJ",0,${缓冲区大小},${0x3000},4)`);        //申请内存
  29.         let 类名长度=执行宏调用(`CALL("User32","GetClassNameA","JJJJ",${窗口句柄},${内存地址},${缓冲区大小})`);
  30.         if(类名长度){类名=内存读取字符串(内存地址);}
  31.         执行宏调用(`CALL("Kernel32","VirtualFree","JJJJ",${内存地址},0,${0x8000})`);        //释放内存
  32.         return 类名;
  33. }

  34. function 获取鼠标位置(){        //返回坐标数组[x,y]
  35.         const 执行宏调用=ExecuteExcel4Macro;
  36.         var 坐标结构=执行宏调用(`CALL("User32","GetCursorPos","1E",0)`);        //参数一:4+4字节坐标结构
  37.         const 缓冲区=new ArrayBuffer(8); //8字节对应64位
  38.         const 数据操作=new DataView(缓冲区);        //操作对象
  39.         数据操作.setFloat64(0,坐标结构);        //(操作)写入64位数
  40.         let 坐标=[];
  41.         坐标[0]=数据操作.getInt32(4);        //取32位坐标x
  42.         坐标[1]=数据操作.getInt32(0);        //取32位坐标y
  43.         return 坐标;
  44. }
  45. function 内存读取字符串(内存地址){        //返回字符串
  46.         const 执行宏调用=ExecuteExcel4Macro,段长度=127;
  47.         const 总字节=执行宏调用(`CALL("Kernel32","lstrlenA","JJ",${内存地址})`);        //内存文本字节数
  48.         let 偏移字节=0,文本字符串=分段文本='';
  49.         while(偏移字节<总字节){        //返回字符串F。        //返回超255字节时,也需要分段操作
  50.                 分段文本=执行宏调用(`CALL("Kernel32","lstrcpynW","FFJJ","",${内存地址+偏移字节},${段长度})`);
  51.                 偏移字节+=分段文本.replace(/[^\x00-\xff]/g,'xx').length;        //计算字符串字节数
  52.                 文本字符串+=分段文本;
  53.         }
  54.         return 文本字符串;
  55. }
复制代码

验证参数可扩展!

发表于 1 小时前 | 显示全部楼层
参数可扩展,不错~
回复

使用道具 举报

 楼主| 发表于 1 小时前 | 显示全部楼层
占位编辑!
回复

使用道具 举报

发表于 1 小时前 | 显示全部楼层
来了解一下。
回复

使用道具 举报

发表于 半小时前 | 显示全部楼层
不明觉厉,谢谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1|闽公网安备35020302032614号 )

GMT+8, 2026-4-26 20:30

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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