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

办公软件WPS的JSA中截图放剪贴板

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

截取全屏:相当于按了截屏键 PrtSc
  1. function 截取全屏图像放入剪贴板测试(){
  2.         console.clear();
  3.         //一、获取全屏框架图纸
  4.         let 屏幕句柄=0,屏幕坐标尺寸=获取屏幕坐标尺寸();
  5.         console.log("屏幕像素尺寸:("+屏幕坐标尺寸[2]+","+屏幕坐标尺寸[3]+")");
  6.         let 全屏架图纸句柄=获取屏幕架图纸();
  7.         console.log("全屏幕框架图纸句柄:"+全屏架图纸句柄);

  8.         //二、转入内存框架图纸,去框架得内存图纸(通过更换纸张)
  9.         let 图纸对象句柄=框架图纸转图纸(全屏架图纸句柄,屏幕坐标尺寸);
  10.         
  11.         //三、复制新图纸
  12.         let 屏幕宽=屏幕坐标尺寸[2]-屏幕坐标尺寸[0],屏幕高=屏幕坐标尺寸[3]-屏幕坐标尺寸[1];
  13.         let 新图纸对象句柄=转印图纸(图纸对象句柄,屏幕宽,屏幕高);
  14.         
  15.         //四、图纸转入剪贴板
  16.         图纸放入剪贴板(新图纸对象句柄);
  17.         
  18.         //let 收纸结果=收起纸笔(图纸对象句柄);        //测试不完善时用
  19.         //if(收纸结果){console.log("图纸回收成功!"+收纸结果);}else{console.log("图纸回收失败。");}
  20. }

  21. function 框架图纸转图纸(框架图纸句柄,坐标尺寸数组){        //返回图纸句柄
  22.         //框架图纸及尺寸
  23.         console.log("框架图纸句柄:"+框架图纸句柄);
  24.         let 起始左=横左=坐标尺寸数组[0],起始上=纵上=坐标尺寸数组[1],横右=坐标尺寸数组[2],纵下=坐标尺寸数组[3];
  25.         let 图像宽=横右-横左,图像高=纵下-纵上;
  26.         console.log("图像宽高:("+图像宽+","+图像高+")");
  27.         
  28.         //抬出桌台和取出空白纸张
  29.         let 印台图纸句柄=抽取内照框图纸(框架图纸句柄);
  30.         if(印台图纸句柄){console.log("内台图纸创建成功!"+印台图纸句柄);}else{console.log("内台图纸创建失败。");}
  31.         let 图纸对象句柄=抽取内照空白纸(框架图纸句柄,图像宽,图像高);        //白纸用于承图
  32.         if(图纸对象句柄){console.log("取空白纸成功!"+图纸对象句柄);}else{console.log("创建位图失败。");}
  33.         
  34.         //台面换上新纸,供拓印图像用        //图随纸走
  35.         let 原图纸对象=更换纸笔(印台图纸句柄,图纸对象句柄);
  36.         if(原图纸对象){console.log("成功更换纸张!新:"+图纸对象句柄+" 旧:"+原图纸对象);}else{console.log("更换纸张失败。");}
  37.         let 拓印结果=图纸拓印(印台图纸句柄,图像宽,图像高,框架图纸句柄);        //九参
  38.         if(拓印结果){console.log("拓印成功!"+拓印结果);}else{console.log("拓印失败。");}
  39.         //let 转印结果=图纸转印(印台图纸句柄,图像宽,图像高,框架图纸句柄);        //十一参
  40.         //if(转印结果){console.log("转印成功!"+转印结果);}else{console.log("转印失败。");}
  41.         
  42.         //收桌板及纸(清理)
  43.         let 取下画纸=更换纸笔(印台图纸句柄,原图纸对象);        //取下的画纸=图纸对象,最后要用
  44.         if(取下画纸){console.log("成功取下画纸!取下(要用):"+取下画纸+" 替换成:"+原图纸对象);}else{console.log("取下画纸失败。");}
  45.         let 收纸结果=收起纸笔(原图纸对象);
  46.         if(收纸结果){console.log("空纸回收成功!"+收纸结果);}else{console.log("图纸对象删除失败。");}
  47.         let 收内框纸结果=收起内照框图纸(印台图纸句柄);        //错误(返回值)结果:0x800A07DF=-2146826273
  48.         if(收内框纸结果){console.log("成功收起内桌台!"+收内框纸结果);}else{console.log("内桌台删除失败。");}
  49.         let 释放结果=放下框架纸(框架图纸句柄);        //参数清理
  50.         if(释放结果){console.log("框架图纸收回成功!"+释放结果);}else{console.log("释放失败。");}
  51.         
  52.         //返回(卷起)图纸对象
  53.         return 图纸对象句柄;
  54. }
  55. function 转印图纸(图纸对象句柄,图像宽,图像高){        //返回新图纸对象句柄
  56.         //新白纸        //用于放位图
  57.         let 新白纸句柄=取空白纸(图像宽,图像高);        //内框架需要换纸再拓印。否则拓印后是全黑的!
  58.         if(新白纸句柄){console.log("取空白纸成功!"+新白纸句柄);}else{console.log("取空白纸失败。");}
  59.         
  60.         //准备拓印桌(台面)架(印板)
  61.         let 源图架纸句柄=抽取内照框图纸(0);                //let 源图架纸句柄=抽取内照框图纸(框架图纸句柄);
  62.         if(源图架纸句柄){console.log("源架纸创建成功!"+源图架纸句柄);}else{console.log("源架创建失败。");}
  63.         let 印桌台纸句柄=抽取内照框图纸(0);                //let 印桌台纸句柄=抽取内照框图纸(框架图纸句柄);
  64.         if(印桌台纸句柄){console.log("印桌纸创建成功!"+印桌台纸句柄);}else{console.log("画桌创建失败。");}
  65.         
  66.         //更换纸张
  67.         let 原架空纸=更换纸笔(源图架纸句柄,图纸对象句柄);        //架板的图,印到桌台的白纸上
  68.         if(原架空纸){console.log("成功换下原架空纸纸张!"+原架空纸);}else{console.log("\t原架纸张更换失败。"+原架空纸);}
  69.         let 原桌空纸=更换纸笔(印桌台纸句柄,新白纸句柄);
  70.         if(原桌空纸){console.log("成功换下原桌空纸!"+原桌空纸);}else{console.log("原桌纸张更换失败。");}
  71.         
  72.         //拓印或转印
  73.         //let 拓印结果=图纸拓印(印桌台纸句柄,图像宽,图像高,源图架纸句柄);        //let 拓印=0xCC0020;
  74.         //if(拓印结果){console.log("拓印成功!"+拓印结果);}else{console.log("拓印失败。");}
  75.         let 转印结果=图纸转印(印桌台纸句柄,图像宽,图像高,源图架纸句柄);
  76.         if(转印结果){console.log("转印成功!");}else{console.log("转印失败。");}
  77.         let 新图纸句柄=新白纸句柄;        //转印成功后纸上就有图了。
  78.         
  79.         //回收纸张
  80.         let 收原图纸结果=收起纸笔(图纸对象句柄);
  81.         if(收原图纸结果){console.log("收原图纸(对象删除)成功!"+收原图纸结果);}else{console.log("收原图纸失败。");}
  82.         
  83.         //撤除拓印桌架
  84.         let 收印台纸结果=收起内照框图纸(印桌台纸句柄);
  85.         if(收印台纸结果){console.log("收内印台纸成功!"+收印台纸结果);}else{console.log("收内印台纸失败。");}
  86.         let 收内架纸结果=收起内照框图纸(源图架纸句柄);
  87.         if(收内架纸结果){console.log("收内架纸成功!"+收内架纸结果);}else{console.log("收内架纸失败。");}
  88.         
  89.         return 新图纸句柄;
  90. }
  91. function 图纸放入剪贴板(图纸对象句柄){
  92.         打开剪贴板();清空剪贴板();
  93.         let 位图数据格式=2;
  94.         设置剪贴板(位图数据格式,图纸对象句柄);        //图纸放入剪贴板(归剪贴板管理,无需手工回收)
  95.         关闭剪贴板();
  96. }

  97. function 获取屏幕坐标尺寸(){        //返回宽高数组[屏幕像素宽,屏幕像素高]
  98.         const 执行宏调用=ExecuteExcel4Macro;
  99.         let 屏幕宽度=0,屏幕高度=1;
  100.         let 屏幕像素宽度=获取系统尺寸(屏幕宽度),屏幕像素高度=获取系统尺寸(屏幕高度);
  101.         return [0,0,屏幕像素宽度,屏幕像素高度];
  102. }
  103. function 获取系统尺寸(名称标识){
  104.         const 执行宏调用=ExecuteExcel4Macro;
  105.         let 获取尺寸=执行宏调用(`CALL("User32","GetSystemMetrics","JJ",${名称标识})`);
  106.         return 获取尺寸;
  107. }

  108. function 获取屏幕架图纸(){return 取架图纸(0);}        //屏幕hDC
  109. function 取架图纸(窗口句柄){        //返回框架图纸句柄
  110.         const 执行宏调用=ExecuteExcel4Macro;        //GetDC后ReleaseDC
  111.         let 框架图纸=执行宏调用(`CALL("User32","GetDC","JJ",${窗口句柄})`);        //窗口工作区hDC
  112.         return 框架图纸;
  113. }
  114. function 获取屏幕框图纸(){return 取框图纸(0);}        //主屏幕hDC
  115. function 取框图纸(窗口句柄){        //返回框架图纸句柄
  116.         const 执行宏调用=ExecuteExcel4Macro;
  117.         发送窗口重绘消息(窗口句柄);
  118.         let 框架图纸=执行宏调用(`CALL("User32","GetWindowDC","JJ",${窗口句柄})`);        //窗口hDC
  119.         return 框架图纸;
  120. }
  121. function 放下框架纸(框架图纸句柄){
  122.         const 执行宏调用=ExecuteExcel4Macro;
  123.         let 释放结果=执行宏调用(`CALL("User32","ReleaseDC","JJJ",0,${框架图纸句柄})`);
  124.         return 释放结果;        //成功1
  125. }
  126. function 抽取内照框图纸(参照框架图纸句柄){        //返回内存框架图纸句柄
  127.         const 执行宏调用=ExecuteExcel4Macro;        //Gdi32.dll        //CreateCompatibleDC后DeleteDC
  128.         let 内存框架图纸=执行宏调用(`CALL("Gdi32","CreateCompatibleDC","JJ",${参照框架图纸句柄})`);
  129.         return 内存框架图纸;
  130. }
  131. function 收起内照框图纸(内存框架图纸句柄){
  132.         const 执行宏调用=ExecuteExcel4Macro;
  133.         let 回收结果=执行宏调用(`CALL("Gdi32","DeleteDC","AJ",${内存框架图纸句柄})`);
  134.         return 回收结果;        //成功true
  135. }
  136. function 取空白纸(纸宽,纸高){        //返回空白图纸句柄
  137.         const 执行宏调用=ExecuteExcel4Macro;                //CreateBitmap后DeleteObject
  138.         let 新空白纸句柄=执行宏调用(`CALL("Gdi32","CreateBitmap","JJJJJJ",${纸宽},${纸高},1,32,0)`);
  139.         return 新空白纸句柄;        //if(新空白纸句柄){console.log("取空白纸成功!");}else{console.log("取空白纸失败。");}
  140. }
  141. function 抽取内照空白纸(参照框架图纸句柄,纸宽,纸高){        //返回内存空白纸句柄
  142.         const 执行宏调用=ExecuteExcel4Macro;        //CreateCompatibleBitmap后DeleteObject
  143.         let 内存空白纸句柄=执行宏调用(`CALL("Gdi32","CreateCompatibleBitmap","JJJJ",${参照框架图纸句柄},${纸宽},${纸高})`);
  144.         return 内存空白纸句柄;
  145. }
  146. function 更换纸笔(框架图纸句柄,新纸笔对象句柄){        //返回原纸笔对象句柄
  147.         const 执行宏调用=ExecuteExcel4Macro;
  148.         let 旧纸笔对象句柄=执行宏调用(`CALL("Gdi32","SelectObject","JJJ",${框架图纸句柄},${新纸笔对象句柄})`);
  149.         return 旧纸笔对象句柄;
  150. }
  151. function 收起纸笔(纸笔对象句柄){
  152.         const 执行宏调用=ExecuteExcel4Macro;
  153.         let 收回结果=执行宏调用(`CALL("Gdi32","DeleteObject","AJ",${纸笔对象句柄})`);
  154.         return 收回结果;        //成功true
  155. }
  156. function 图纸拓印(拓台图纸句柄,图纸宽度,图纸高度,印架图纸句柄){let 拓印=0xCC0020;let 拓印结果=图纸线描(拓台图纸句柄,0,0,图纸宽度,图纸高度,印架图纸句柄,0,0,拓印);return 拓印结果;}
  157. function 图纸线描(桌台图纸句柄,白纸起始水平,白纸起始垂直,描宽,描高,架板图纸句柄,图纸起始水平,图纸起始垂直,描手法){
  158.         const 执行宏调用=ExecuteExcel4Macro;        //框架印向桌台        //动作为拓印
  159.         let 线描结果=执行宏调用(`CALL("Gdi32","BitBlt","AJJJJJJJJJ",${桌台图纸句柄},${白纸起始水平},${白纸起始垂直},${描宽},${描高},${架板图纸句柄},${图纸起始水平},${图纸起始垂直},${描手法})`);
  160.         return 线描结果;        //成功true
  161. }
  162. function 图纸转印(拓台图纸句柄,图纸宽度,图纸高度,印架图纸句柄){let 转印=0xCC0020;let 转印结果=图纸涂绘(拓台图纸句柄,0,0,图纸宽度,图纸高度,印架图纸句柄,0,0,图纸宽度,图纸高度,转印);return 转印结果;}
  163. function 图纸涂绘(桌台图纸句柄,白纸起始水平,白纸起始垂直,绘宽,绘高,架板图纸句柄,图纸起始水平,图纸起始垂直,图纸宽度,图纸高度,绘手法){
  164.         const 执行宏调用=ExecuteExcel4Macro,转印=0xCC0020;        //框架印向桌台        //动作转印同拓印
  165.         let 涂绘结果=执行宏调用(`CALL("Gdi32","StretchBlt","AJJJJJJJJJJJ",${桌台图纸句柄},${白纸起始水平},${白纸起始垂直},${绘宽},${绘高},${架板图纸句柄},${图纸起始水平},${图纸起始垂直},${图纸宽度},${图纸高度},${绘手法})`);
  166.         return 涂绘结果;        //成功true
  167. }

  168. function 打开剪贴板(){
  169.         const 执行宏调用=ExecuteExcel4Macro;
  170.         let 打开结果=执行宏调用(`CALL("User32","OpenClipboard","AJ",0)`);
  171.         return 打开结果;        //if(打开结果){console.log("成功打开剪贴板!");}else{console.log("剪贴板打开失败。");}
  172. }
  173. function 清空剪贴板(){
  174.         const 执行宏调用=ExecuteExcel4Macro;
  175.         let 清空结果=执行宏调用(`CALL("User32","EmptyClipboard","A")`);
  176.         return 清空结果;        //if(清空结果){console.log("成功清空剪贴板!");}else{console.log("剪贴板清空失败。");}
  177. }
  178. function 设置剪贴板(数据格式,数据句柄){
  179.         const 执行宏调用=ExecuteExcel4Macro;        //数据格式:位图2 文本1 统一文本0xD=13
  180.         let 数据内存句柄=执行宏调用(`CALL("User32","SetClipboardData","JJJ",${数据格式},${数据句柄})`);
  181.         return 数据内存句柄;        //if(数据内存句柄){console.log("成功设置剪贴板!");}else{console.log("剪贴板设置失败。");}
  182. }
  183. function 关闭剪贴板(){
  184.         const 执行宏调用=ExecuteExcel4Macro;
  185.         let 关闭结果=执行宏调用(`CALL("User32","CloseClipboard","A")`);
  186.         return 关闭结果;        //if(关闭结果){console.log("成功关闭剪贴板!");}else{console.log("剪贴板关闭失败。");}
  187. }
复制代码


 楼主| 发表于 6 小时前 | 显示全部楼层

截全屏入剪贴板 简版

本帖最后由 cutebe 于 2026-5-18 17:03 编辑

简化:去除图像复制转存步骤
  1. function 截取全屏图像放入剪贴板简版测试(){
  2.         console.clear();
  3.         //一、获取全屏框架图纸
  4.         let 屏幕句柄=0,屏幕坐标尺寸=获取屏幕坐标尺寸();
  5.         let 全屏架图纸句柄=获取屏幕架图纸();

  6.         //二、转入内存框架图纸,去框架得内存图纸(通过更换纸张)
  7.         let 图纸对象句柄=框架图纸转图纸(全屏架图纸句柄,屏幕坐标尺寸);

  8.         //三、图纸转入剪贴板
  9.         图纸放入剪贴板(图纸对象句柄);
  10. }

  11. function 框架图纸转图纸(框架图纸句柄,坐标尺寸数组){        //返回图纸句柄
  12.         //框架图纸及尺寸
  13.         console.log("框架图纸句柄:"+框架图纸句柄);
  14.         let 起始左=横左=坐标尺寸数组[0],起始上=纵上=坐标尺寸数组[1],横右=坐标尺寸数组[2],纵下=坐标尺寸数组[3];
  15.         let 图像宽=横右-横左,图像高=纵下-纵上;
  16.         console.log("图像宽高:("+图像宽+","+图像高+")");
  17.        
  18.         //抬出桌台和取出空白纸张
  19.         let 印台图纸句柄=抽取内照框图纸(框架图纸句柄);
  20.         if(印台图纸句柄){console.log("内台图纸创建成功!"+印台图纸句柄);}else{console.log("内台图纸创建失败。");}
  21.         let 图纸对象句柄=抽取内照空白纸(框架图纸句柄,图像宽,图像高);        //白纸用于承图
  22.         if(图纸对象句柄){console.log("取空白纸成功!"+图纸对象句柄);}else{console.log("创建位图失败。");}
  23.        
  24.         //台面换上新纸,供拓印图像用        //图随纸走
  25.         let 原图纸对象=更换纸笔(印台图纸句柄,图纸对象句柄);
  26.         if(原图纸对象){console.log("成功更换纸张!新:"+图纸对象句柄+" 旧:"+原图纸对象);}else{console.log("更换纸张失败。");}
  27.         let 拓印结果=图纸拓印(印台图纸句柄,图像宽,图像高,框架图纸句柄);        //九参
  28.         if(拓印结果){console.log("拓印成功!"+拓印结果);}else{console.log("拓印失败。");}
  29.         //let 转印结果=图纸转印(印台图纸句柄,图像宽,图像高,框架图纸句柄);        //十一参
  30.         //if(转印结果){console.log("转印成功!"+转印结果);}else{console.log("转印失败。");}
  31.        
  32.         //收桌板及纸(清理)
  33.         let 取下画纸=更换纸笔(印台图纸句柄,原图纸对象);        //取下的画纸=图纸对象,最后要用
  34.         if(取下画纸){console.log("成功取下画纸!取下(要用):"+取下画纸+" 替换成:"+原图纸对象);}else{console.log("取下画纸失败。");}
  35.         let 收纸结果=收起纸笔(原图纸对象);
  36.         if(收纸结果){console.log("空纸回收成功!"+收纸结果);}else{console.log("图纸对象删除失败。");}
  37.         let 收内框纸结果=收起内照框图纸(印台图纸句柄);        //错误(返回值)结果:0x800A07DF=-2146826273
  38.         if(收内框纸结果){console.log("成功收起内桌台!"+收内框纸结果);}else{console.log("内桌台删除失败。");}
  39.         let 释放结果=放下框架纸(框架图纸句柄);        //参数清理
  40.         if(释放结果){console.log("框架图纸收回成功!"+释放结果);}else{console.log("释放失败。");}
  41.        
  42.         //返回(卷起)图纸对象
  43.         return 图纸对象句柄;
  44. }
  45. function 图纸放入剪贴板(图纸对象句柄){
  46.         打开剪贴板();清空剪贴板();
  47.         let 位图数据格式=2;
  48.         设置剪贴板(位图数据格式,图纸对象句柄);        //图纸放入剪贴板(归剪贴板管理,无需手工回收)
  49.         关闭剪贴板();
  50. }

  51. function 获取屏幕坐标尺寸(){        //返回宽高数组[屏幕像素宽,屏幕像素高]
  52.         const 执行宏调用=ExecuteExcel4Macro;
  53.         let 屏幕宽度=0,屏幕高度=1;
  54.         let 屏幕像素宽度=获取系统尺寸(屏幕宽度),屏幕像素高度=获取系统尺寸(屏幕高度);
  55.         return [0,0,屏幕像素宽度,屏幕像素高度];
  56. }
  57. function 获取系统尺寸(名称标识){
  58.         const 执行宏调用=ExecuteExcel4Macro;
  59.         let 获取尺寸=执行宏调用(`CALL("User32","GetSystemMetrics","JJ",${名称标识})`);
  60.         return 获取尺寸;
  61. }

  62. function 获取屏幕架图纸(){return 取架图纸(0);}        //屏幕hDC
  63. function 取架图纸(窗口句柄){        //返回框架图纸句柄
  64.         const 执行宏调用=ExecuteExcel4Macro;        //GetDC后ReleaseDC
  65.         let 框架图纸=执行宏调用(`CALL("User32","GetDC","JJ",${窗口句柄})`);        //窗口工作区hDC
  66.         return 框架图纸;
  67. }
  68. function 获取屏幕框图纸(){return 取框图纸(0);}        //主屏幕hDC
  69. function 取框图纸(窗口句柄){        //返回框架图纸句柄
  70.         const 执行宏调用=ExecuteExcel4Macro;
  71.         发送窗口重绘消息(窗口句柄);
  72.         let 框架图纸=执行宏调用(`CALL("User32","GetWindowDC","JJ",${窗口句柄})`);        //窗口hDC
  73.         return 框架图纸;
  74. }
  75. function 放下框架纸(框架图纸句柄){
  76.         const 执行宏调用=ExecuteExcel4Macro;
  77.         let 释放结果=执行宏调用(`CALL("User32","ReleaseDC","JJJ",0,${框架图纸句柄})`);
  78.         return 释放结果;        //成功1
  79. }
  80. function 抽取内照框图纸(参照框架图纸句柄){        //返回内存框架图纸句柄
  81.         const 执行宏调用=ExecuteExcel4Macro;        //Gdi32.dll        //CreateCompatibleDC后DeleteDC
  82.         let 内存框架图纸=执行宏调用(`CALL("Gdi32","CreateCompatibleDC","JJ",${参照框架图纸句柄})`);
  83.         return 内存框架图纸;
  84. }
  85. function 收起内照框图纸(内存框架图纸句柄){
  86.         const 执行宏调用=ExecuteExcel4Macro;
  87.         let 回收结果=执行宏调用(`CALL("Gdi32","DeleteDC","AJ",${内存框架图纸句柄})`);
  88.         return 回收结果;        //成功true
  89. }
  90. function 取空白纸(纸宽,纸高){        //返回空白图纸句柄
  91.         const 执行宏调用=ExecuteExcel4Macro;                //CreateBitmap后DeleteObject
  92.         let 新空白纸句柄=执行宏调用(`CALL("Gdi32","CreateBitmap","JJJJJJ",${纸宽},${纸高},1,32,0)`);
  93.         return 新空白纸句柄;        //if(新空白纸句柄){console.log("取空白纸成功!");}else{console.log("取空白纸失败。");}
  94. }
  95. function 抽取内照空白纸(参照框架图纸句柄,纸宽,纸高){        //返回内存空白纸句柄
  96.         const 执行宏调用=ExecuteExcel4Macro;        //CreateCompatibleBitmap后DeleteObject
  97.         let 内存空白纸句柄=执行宏调用(`CALL("Gdi32","CreateCompatibleBitmap","JJJJ",${参照框架图纸句柄},${纸宽},${纸高})`);
  98.         return 内存空白纸句柄;
  99. }
  100. function 更换纸笔(框架图纸句柄,新纸笔对象句柄){        //返回原纸笔对象句柄
  101.         const 执行宏调用=ExecuteExcel4Macro;
  102.         let 旧纸笔对象句柄=执行宏调用(`CALL("Gdi32","SelectObject","JJJ",${框架图纸句柄},${新纸笔对象句柄})`);
  103.         return 旧纸笔对象句柄;
  104. }
  105. function 收起纸笔(纸笔对象句柄){
  106.         const 执行宏调用=ExecuteExcel4Macro;
  107.         let 收回结果=执行宏调用(`CALL("Gdi32","DeleteObject","AJ",${纸笔对象句柄})`);
  108.         return 收回结果;        //成功true
  109. }
  110. function 图纸拓印(拓台图纸句柄,图纸宽度,图纸高度,印架图纸句柄){let 拓印=0xCC0020;let 拓印结果=图纸线描(拓台图纸句柄,0,0,图纸宽度,图纸高度,印架图纸句柄,0,0,拓印);return 拓印结果;}
  111. function 图纸线描(桌台图纸句柄,白纸起始水平,白纸起始垂直,描宽,描高,架板图纸句柄,图纸起始水平,图纸起始垂直,描手法){
  112.         const 执行宏调用=ExecuteExcel4Macro;        //框架印向桌台        //动作为拓印
  113.         let 线描结果=执行宏调用(`CALL("Gdi32","BitBlt","AJJJJJJJJJ",${桌台图纸句柄},${白纸起始水平},${白纸起始垂直},${描宽},${描高},${架板图纸句柄},${图纸起始水平},${图纸起始垂直},${描手法})`);
  114.         return 线描结果;        //成功true
  115. }
  116. function 图纸转印(拓台图纸句柄,图纸宽度,图纸高度,印架图纸句柄){let 转印=0xCC0020;let 转印结果=图纸涂绘(拓台图纸句柄,0,0,图纸宽度,图纸高度,印架图纸句柄,0,0,图纸宽度,图纸高度,转印);return 转印结果;}
  117. function 图纸涂绘(桌台图纸句柄,白纸起始水平,白纸起始垂直,绘宽,绘高,架板图纸句柄,图纸起始水平,图纸起始垂直,图纸宽度,图纸高度,绘手法){
  118.         const 执行宏调用=ExecuteExcel4Macro,转印=0xCC0020;        //框架印向桌台        //动作转印同拓印
  119.         let 涂绘结果=执行宏调用(`CALL("Gdi32","StretchBlt","AJJJJJJJJJJJ",${桌台图纸句柄},${白纸起始水平},${白纸起始垂直},${绘宽},${绘高},${架板图纸句柄},${图纸起始水平},${图纸起始垂直},${图纸宽度},${图纸高度},${绘手法})`);
  120.         return 涂绘结果;        //成功true
  121. }

  122. function 打开剪贴板(){
  123.         const 执行宏调用=ExecuteExcel4Macro;
  124.         let 打开结果=执行宏调用(`CALL("User32","OpenClipboard","AJ",0)`);
  125.         return 打开结果;        //if(打开结果){console.log("成功打开剪贴板!");}else{console.log("剪贴板打开失败。");}
  126. }
  127. function 清空剪贴板(){
  128.         const 执行宏调用=ExecuteExcel4Macro;
  129.         let 清空结果=执行宏调用(`CALL("User32","EmptyClipboard","A")`);
  130.         return 清空结果;        //if(清空结果){console.log("成功清空剪贴板!");}else{console.log("剪贴板清空失败。");}
  131. }
  132. function 设置剪贴板(数据格式,数据句柄){
  133.         const 执行宏调用=ExecuteExcel4Macro;        //数据格式:位图2 文本1 统一文本0xD=13
  134.         let 数据内存句柄=执行宏调用(`CALL("User32","SetClipboardData","JJJ",${数据格式},${数据句柄})`);
  135.         return 数据内存句柄;        //if(数据内存句柄){console.log("成功设置剪贴板!");}else{console.log("剪贴板设置失败。");}
  136. }
  137. function 关闭剪贴板(){
  138.         const 执行宏调用=ExecuteExcel4Macro;
  139.         let 关闭结果=执行宏调用(`CALL("User32","CloseClipboard","A")`);
  140.         return 关闭结果;        //if(关闭结果){console.log("成功关闭剪贴板!");}else{console.log("剪贴板关闭失败。");}
  141. }
复制代码


回复

使用道具 举报

 楼主| 发表于 6 小时前 | 显示全部楼层

截取鼠标所指窗口图像放入剪贴板

本帖最后由 cutebe 于 2026-5-18 17:16 编辑

鼠标指针所指窗口
  1. function 截取窗口图像放入剪贴板测试(){        //鼠标指针所指窗口截图
  2.         console.clear();
  3.         //一、获取鼠标指向窗口框架图纸
  4.         let 窗口句柄=鼠标所指窗口句柄();
  5.         let 窗口坐标=获取窗口坐标(窗口句柄);
  6.         let 窗口宽=窗口坐标[2]-窗口坐标[0],窗口高=窗口坐标[3]-窗口坐标[1];
  7.         console.log("窗口坐标尺寸:("+窗口宽+","+窗口高+")"+窗口坐标);
  8.         let 窗框图纸句柄=取框图纸(窗口句柄);
  9.         console.log("窗口框架图纸句柄:"+窗框图纸句柄);

  10.         //二、转入内存框架图纸,去框架得内存图纸(通过更换纸张)
  11.         let 图纸对象句柄=框架图纸转图纸(窗框图纸句柄,窗口坐标);

  12.         //三、图纸转入剪贴板
  13.         图纸放入剪贴板(图纸对象句柄);
  14. }
  15. function 鼠标所指窗口句柄(){        //返回窗口句柄
  16.         const 执行宏调用=ExecuteExcel4Macro;
  17.         let 鼠标指针坐标=获取鼠标位置();        //===调用函数===//
  18.         let 水平=鼠标指针坐标[0],垂直=鼠标指针坐标[1];        //鼠标指针处窗口句柄        //扩展了一个参数
  19.         let 窗口句柄=执行宏调用(`CALL("User32", "WindowFromPoint", "JJJ", ${水平},${垂直})`);
  20.         return 窗口句柄;
  21. }
  22. function 获取鼠标位置(){        //屏幕左上角开始,向右为x,向下为y
  23.         const 执行宏调用=ExecuteExcel4Macro;
  24.         let 坐标数据=执行宏调用(`CALL("User32","GetCursorPos","1E",0)`);
  25.         const 缓冲区=new ArrayBuffer(8); //8字节对应64位
  26.         const 数据操作=new DataView(缓冲区);        //操作对象
  27.         数据操作.setFloat64(0,坐标数据);        //(操作)写入64位数
  28.         let 坐标=[];
  29.         坐标[0]=数据操作.getInt32(4);        //取32位坐标x
  30.         坐标[1]=数据操作.getInt32(0);        //取32位坐标y
  31.         return 坐标;        //返回坐标数组
  32. }
  33. function 获取窗口坐标(窗口句柄){        //返回坐标数组:左上右下
  34.         const 执行宏调用=ExecuteExcel4Macro;
  35.         let 坐标内存地址=申请虚拟内存(16);
  36.         let 结果=执行宏调用(`CALL("User32","GetWindowRect","JJJ",${窗口句柄},${坐标内存地址})`);
  37.         let 坐标数组=内存读取数组(坐标内存地址,4);        //返回坐标数组:左上右下
  38.         释放虚拟内存(坐标内存地址);
  39.         return 坐标数组;
  40. }
  41. function 内存读取数组(内存地址,数组长度){        //返回数组
  42.         const 执行宏调用=ExecuteExcel4Macro;
  43.         let 数据数组=[],读取字节=4;
  44.         for(let 偏移=i=0;i<数组长度;i++){        //库Kernel32.dll和NtDll.dll里都有RtlMoveMemory
  45.                 读出数据=执行宏调用(`CALL("Kernel32","RtlMoveMemory","1NJJ",${内存地址},${内存地址+偏移},${读取字节})`);        //读出
  46.                 数据数组.push(读出数据);偏移+=读取字节;
  47.         }
  48.         return 数据数组;        //返回
  49. }
  50. function 申请虚拟内存(字节数){        //返回内存地址
  51.         const 执行宏调用=ExecuteExcel4Macro;
  52.         const 内存地址=执行宏调用(`CALL("Kernel32","VirtualAlloc","JJJJJ",0,${字节数},${0x3000},4)`);
  53.         return 内存地址;
  54. }
  55. function 释放虚拟内存(内存地址){
  56.         const 执行宏调用=ExecuteExcel4Macro;
  57.         执行宏调用(`CALL("Kernel32","VirtualFree","JJJJ",${内存地址},0,${0x8000})`);
  58. }
  59. function 发送窗口重绘消息(窗口句柄){
  60.         const 执行宏调用=ExecuteExcel4Macro,重绘=0xF;        //WM_PAINT=0xF
  61.         let 结果=执行宏调用(`CALL("User32", "SendMessageA", "JJJJJ", ${窗口句柄},${重绘},0,0)`);
  62.         console.log("窗口重绘消息执行结果:"+结果);
  63. }

  64. function 框架图纸转图纸(框架图纸句柄,坐标尺寸数组){        //返回图纸句柄
  65.         //框架图纸及尺寸
  66.         console.log("框架图纸句柄:"+框架图纸句柄);
  67.         let 起始左=横左=坐标尺寸数组[0],起始上=纵上=坐标尺寸数组[1],横右=坐标尺寸数组[2],纵下=坐标尺寸数组[3];
  68.         let 图像宽=横右-横左,图像高=纵下-纵上;
  69.         console.log("图像宽高:("+图像宽+","+图像高+")");
  70.         
  71.         //抬出桌台和取出空白纸张
  72.         let 印台图纸句柄=抽取内照框图纸(框架图纸句柄);
  73.         if(印台图纸句柄){console.log("内台图纸创建成功!"+印台图纸句柄);}else{console.log("内台图纸创建失败。");}
  74.         let 图纸对象句柄=抽取内照空白纸(框架图纸句柄,图像宽,图像高);        //白纸用于承图
  75.         if(图纸对象句柄){console.log("取空白纸成功!"+图纸对象句柄);}else{console.log("创建位图失败。");}
  76.         
  77.         //台面换上新纸,供拓印图像用        //图随纸走
  78.         let 原图纸对象=更换纸笔(印台图纸句柄,图纸对象句柄);
  79.         if(原图纸对象){console.log("成功更换纸张!新:"+图纸对象句柄+" 旧:"+原图纸对象);}else{console.log("更换纸张失败。");}
  80.         let 拓印结果=图纸拓印(印台图纸句柄,图像宽,图像高,框架图纸句柄);        //九参
  81.         if(拓印结果){console.log("拓印成功!"+拓印结果);}else{console.log("拓印失败。");}
  82.         //let 转印结果=图纸转印(印台图纸句柄,图像宽,图像高,框架图纸句柄);        //十一参
  83.         //if(转印结果){console.log("转印成功!"+转印结果);}else{console.log("转印失败。");}
  84.         
  85.         //收桌板及纸(清理)
  86.         let 取下画纸=更换纸笔(印台图纸句柄,原图纸对象);        //取下的画纸=图纸对象,最后要用
  87.         if(取下画纸){console.log("成功取下画纸!取下(要用):"+取下画纸+" 替换成:"+原图纸对象);}else{console.log("取下画纸失败。");}
  88.         let 收纸结果=收起纸笔(原图纸对象);
  89.         if(收纸结果){console.log("空纸回收成功!"+收纸结果);}else{console.log("图纸对象删除失败。");}
  90.         let 收内框纸结果=收起内照框图纸(印台图纸句柄);        //错误(返回值)结果:0x800A07DF=-2146826273
  91.         if(收内框纸结果){console.log("成功收起内桌台!"+收内框纸结果);}else{console.log("内桌台删除失败。");}
  92.         let 释放结果=放下框架纸(框架图纸句柄);        //参数清理
  93.         if(释放结果){console.log("框架图纸收回成功!"+释放结果);}else{console.log("释放失败。");}
  94.         
  95.         //返回(卷起)图纸对象
  96.         return 图纸对象句柄;
  97. }
  98. function 图纸放入剪贴板(图纸对象句柄){
  99.         打开剪贴板();清空剪贴板();
  100.         let 位图数据格式=2;
  101.         设置剪贴板(位图数据格式,图纸对象句柄);        //图纸放入剪贴板(归剪贴板管理,无需手工回收)
  102.         关闭剪贴板();
  103. }

  104. function 获取屏幕架图纸(){return 取架图纸(0);}        //屏幕hDC
  105. function 取架图纸(窗口句柄){        //返回框架图纸句柄
  106.         const 执行宏调用=ExecuteExcel4Macro;        //GetDC后ReleaseDC
  107.         let 框架图纸=执行宏调用(`CALL("User32","GetDC","JJ",${窗口句柄})`);        //窗口工作区hDC
  108.         return 框架图纸;
  109. }
  110. function 获取屏幕框图纸(){return 取框图纸(0);}        //主屏幕hDC
  111. function 取框图纸(窗口句柄){        //返回框架图纸句柄
  112.         const 执行宏调用=ExecuteExcel4Macro;
  113.         发送窗口重绘消息(窗口句柄);
  114.         let 框架图纸=执行宏调用(`CALL("User32","GetWindowDC","JJ",${窗口句柄})`);        //窗口hDC
  115.         return 框架图纸;
  116. }
  117. function 放下框架纸(框架图纸句柄){
  118.         const 执行宏调用=ExecuteExcel4Macro;
  119.         let 释放结果=执行宏调用(`CALL("User32","ReleaseDC","JJJ",0,${框架图纸句柄})`);
  120.         return 释放结果;        //成功1
  121. }
  122. function 抽取内照框图纸(参照框架图纸句柄){        //返回内存框架图纸句柄
  123.         const 执行宏调用=ExecuteExcel4Macro;        //Gdi32.dll        //CreateCompatibleDC后DeleteDC
  124.         let 内存框架图纸=执行宏调用(`CALL("Gdi32","CreateCompatibleDC","JJ",${参照框架图纸句柄})`);
  125.         return 内存框架图纸;
  126. }
  127. function 收起内照框图纸(内存框架图纸句柄){
  128.         const 执行宏调用=ExecuteExcel4Macro;
  129.         let 回收结果=执行宏调用(`CALL("Gdi32","DeleteDC","AJ",${内存框架图纸句柄})`);
  130.         return 回收结果;        //成功true
  131. }
  132. function 取空白纸(纸宽,纸高){        //返回空白图纸句柄
  133.         const 执行宏调用=ExecuteExcel4Macro;                //CreateBitmap后DeleteObject
  134.         let 新空白纸句柄=执行宏调用(`CALL("Gdi32","CreateBitmap","JJJJJJ",${纸宽},${纸高},1,32,0)`);
  135.         return 新空白纸句柄;        //if(新空白纸句柄){console.log("取空白纸成功!");}else{console.log("取空白纸失败。");}
  136. }
  137. function 抽取内照空白纸(参照框架图纸句柄,纸宽,纸高){        //返回内存空白纸句柄
  138.         const 执行宏调用=ExecuteExcel4Macro;        //CreateCompatibleBitmap后DeleteObject
  139.         let 内存空白纸句柄=执行宏调用(`CALL("Gdi32","CreateCompatibleBitmap","JJJJ",${参照框架图纸句柄},${纸宽},${纸高})`);
  140.         return 内存空白纸句柄;
  141. }
  142. function 更换纸笔(框架图纸句柄,新纸笔对象句柄){        //返回原纸笔对象句柄
  143.         const 执行宏调用=ExecuteExcel4Macro;
  144.         let 旧纸笔对象句柄=执行宏调用(`CALL("Gdi32","SelectObject","JJJ",${框架图纸句柄},${新纸笔对象句柄})`);
  145.         return 旧纸笔对象句柄;
  146. }
  147. function 收起纸笔(纸笔对象句柄){
  148.         const 执行宏调用=ExecuteExcel4Macro;
  149.         let 收回结果=执行宏调用(`CALL("Gdi32","DeleteObject","AJ",${纸笔对象句柄})`);
  150.         return 收回结果;        //成功true
  151. }
  152. function 图纸拓印(拓台图纸句柄,图纸宽度,图纸高度,印架图纸句柄){let 拓印=0xCC0020;let 拓印结果=图纸线描(拓台图纸句柄,0,0,图纸宽度,图纸高度,印架图纸句柄,0,0,拓印);return 拓印结果;}
  153. function 图纸线描(桌台图纸句柄,白纸起始水平,白纸起始垂直,描宽,描高,架板图纸句柄,图纸起始水平,图纸起始垂直,描手法){
  154.         const 执行宏调用=ExecuteExcel4Macro;        //框架印向桌台        //动作为拓印
  155.         let 线描结果=执行宏调用(`CALL("Gdi32","BitBlt","AJJJJJJJJJ",${桌台图纸句柄},${白纸起始水平},${白纸起始垂直},${描宽},${描高},${架板图纸句柄},${图纸起始水平},${图纸起始垂直},${描手法})`);
  156.         return 线描结果;        //成功true
  157. }
  158. function 图纸转印(拓台图纸句柄,图纸宽度,图纸高度,印架图纸句柄){let 转印=0xCC0020;let 转印结果=图纸涂绘(拓台图纸句柄,0,0,图纸宽度,图纸高度,印架图纸句柄,0,0,图纸宽度,图纸高度,转印);return 转印结果;}
  159. function 图纸涂绘(桌台图纸句柄,白纸起始水平,白纸起始垂直,绘宽,绘高,架板图纸句柄,图纸起始水平,图纸起始垂直,图纸宽度,图纸高度,绘手法){
  160.         const 执行宏调用=ExecuteExcel4Macro,转印=0xCC0020;        //框架印向桌台        //动作转印同拓印
  161.         let 涂绘结果=执行宏调用(`CALL("Gdi32","StretchBlt","AJJJJJJJJJJJ",${桌台图纸句柄},${白纸起始水平},${白纸起始垂直},${绘宽},${绘高},${架板图纸句柄},${图纸起始水平},${图纸起始垂直},${图纸宽度},${图纸高度},${绘手法})`);
  162.         return 涂绘结果;        //成功true
  163. }

  164. function 打开剪贴板(){
  165.         const 执行宏调用=ExecuteExcel4Macro;
  166.         let 打开结果=执行宏调用(`CALL("User32","OpenClipboard","AJ",0)`);
  167.         return 打开结果;        //if(打开结果){console.log("成功打开剪贴板!");}else{console.log("剪贴板打开失败。");}
  168. }
  169. function 清空剪贴板(){
  170.         const 执行宏调用=ExecuteExcel4Macro;
  171.         let 清空结果=执行宏调用(`CALL("User32","EmptyClipboard","A")`);
  172.         return 清空结果;        //if(清空结果){console.log("成功清空剪贴板!");}else{console.log("剪贴板清空失败。");}
  173. }
  174. function 设置剪贴板(数据格式,数据句柄){
  175.         const 执行宏调用=ExecuteExcel4Macro;        //数据格式:位图2 文本1 统一文本0xD=13
  176.         let 数据内存句柄=执行宏调用(`CALL("User32","SetClipboardData","JJJ",${数据格式},${数据句柄})`);
  177.         return 数据内存句柄;        //if(数据内存句柄){console.log("成功设置剪贴板!");}else{console.log("剪贴板设置失败。");}
  178. }
  179. function 关闭剪贴板(){
  180.         const 执行宏调用=ExecuteExcel4Macro;
  181.         let 关闭结果=执行宏调用(`CALL("User32","CloseClipboard","A")`);
  182.         return 关闭结果;        //if(关闭结果){console.log("成功关闭剪贴板!");}else{console.log("剪贴板关闭失败。");}
  183. }
复制代码


回复

使用道具 举报

发表于 6 小时前 | 显示全部楼层
占楼评论感谢楼主分享!
回复

使用道具 举报

发表于 6 小时前 | 显示全部楼层
AI 流水线

点评

纯手工编写  发表于 5 小时前
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-5-18 23:19

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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