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

办公软件WPS的JSA中设置/获取鼠标指针位置

  [复制链接]
发表于 3 天前 | 显示全部楼层 |阅读模式
通过ExecuteExcel4Macro调用WinAPI,获取/设置鼠标指针的坐标。

  1. function 鼠标操作测试(){
  2.         let 鼠标指针坐标=获取鼠标位置();        /*****调用函数*****/
  3.         let 水平=鼠标指针坐标[0],垂直=鼠标指针坐标[1];
  4.         console.clear();
  5.         console.log("鼠标当前位置:("+水平+","+垂直+")");

  6.         let 定位操作=设置鼠标位置(800,300);        /*****调用函数*****/
  7.         if(定位操作){console.log("设置成功!");}
  8. }

  9. function 设置鼠标位置(水平,垂直){
  10.         const 执行宏调用=ExecuteExcel4Macro;
  11.         var 结果=执行宏调用(`CALL("User32","SetCursorPos","AJJ",${水平},${垂直})`);
  12.         return 结果;        //成功返回true
  13. }
  14. function 获取鼠标位置(){        //返回坐标数组[x,y]
  15.         const 执行宏调用=ExecuteExcel4Macro;
  16.         //逻辑值 GetCursorPos([输出]结构 屏幕坐标指针)
  17.         var 坐标结构=执行宏调用(`CALL("User32","GetCursorPos","1E",0)`);        //参数一:4+4字节坐标结构
  18.         //函数获取光标坐标GetCursorPos,后面跟的“1E”指返回值类型为“1”,指让第一个参数值作为返回值。
  19.         //第一个参数类型E为浮点数(8字节),正好可容下4+4字节的坐标结构(8字节=4字节坐标x+4字节坐标y)
  20.         const 缓冲区=new ArrayBuffer(8); //8字节对应64位
  21.         const 数据操作=new DataView(缓冲区);        //操作对象
  22.         数据操作.setFloat64(0,坐标结构);        //(操作)写入64位数
  23.         let 坐标=[];
  24.         坐标[0]=数据操作.getInt32(4);        //取32位坐标x
  25.         坐标[1]=数据操作.getInt32(0);        //取32位坐标y
  26.         return 坐标;
  27. }
复制代码


发表于 前天 08:04 | 显示全部楼层
  1. function 鼠标操作测试() {
  2.     try {
  3.         // 获取当前鼠标位置
  4.         let 鼠标指针坐标 = 获取鼠标位置();
  5.         if (!鼠标指针坐标) {
  6.             console.log("获取鼠标位置失败。");
  7.             return;
  8.         }

  9.         let 水平 = 鼠标指针坐标[0];
  10.         水平 = Math.max(0, 水平); // 确保不为负值
  11.         let 垂直 = 鼠标指针坐标[1];
  12.         垂直 = Math.max(0, 垂直);

  13.         console.clear();
  14.         console.log("鼠标当前位置:(" + 水平 + ", " + 垂直 + ")");

  15.         // 设置鼠标新位置
  16.         let 定位操作 = 设置鼠标位置(800, 300);
  17.         if (定位操作) {
  18.             console.log("鼠标已成功移动到:(800, 300)");
  19.         } else {
  20.             console.log("设置鼠标位置失败。");
  21.         }
  22.     } catch (e) {
  23.         console.error("发生错误:" + e.message);
  24.     }
  25. }

  26. function 设置鼠标位置(水平, 垂直) {
  27.     try {
  28.         const 执行宏调用 = ExecuteExcel4Macro;

  29.         // 调用 User32.dll 的 SetCursorPos 函数
  30.         // 参数类型:A=stdcall, JJ=两个 32 位整数(x, y)
  31.         var 结果 = 执行宏调用(`CALL("User32","SetCursorPos","AJJ",${水平},${垂直})`);
  32.         return 结果 === true || 结果 === 1;
  33.     } catch (e) {
  34.         console.error("设置鼠标位置时发生错误:" + e.message);
  35.         return false;
  36.     }
  37. }

  38. function 获取鼠标位置() {
  39.     try {
  40.         const 执行宏调用 = ExecuteExcel4Macro;

  41.         // 调用 GetCursorPos,返回一个包含坐标的浮点数值
  42.         var 坐标结构 = 执行宏调用(`CALL("User32","GetCursorPos","1E",0)`);

  43.         if (typeof 坐标结构 !== "number") {
  44.             console.error("获取坐标结构失败。");
  45.             return null;
  46.         }

  47.         // 使用 DataView 解析 64 位浮点数中的两个 32 位整数(x 和 y)
  48.         const 缓冲区 = new ArrayBuffer(8);
  49.         const 数据操作 = new DataView(缓冲区);

  50.         数据操作.setFloat64(0, 坐标结构, true); // true 表示小端序

  51.         let x = 数据操作.getInt32(0, true);  // 低 4 字节为 x
  52.         let y = 数据操作.getInt32(4, true);  // 高 4 字节为 y

  53.         return [x, y];
  54.     } catch (e) {
  55.         console.error("获取鼠标位置时发生错误:" + e.message);
  56.         return null;
  57.     }
  58. }
复制代码


回复

使用道具 举报

发表于 前天 12:25 | 显示全部楼层
感谢分享
回复

使用道具 举报

发表于 前天 13:35 | 显示全部楼层
来学习下
回复

使用道具 举报

发表于 前天 20:27 | 显示全部楼层
在论坛每天都能跟大佬学到东西
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-4-14 20:19

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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