找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 47|回复: 2

[转载代码] 办公软件WPS的JSA中截屏

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

截取全屏,相当于按了截屏键 Print Screen
  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. }
复制代码
 楼主| 发表于 昨天 21:33 | 显示全部楼层

截取鼠标所指窗口

  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. }
复制代码

系统Win7时,窗口标题因透明而异常。
 楼主| 发表于 昨天 21:36 | 显示全部楼层

截取指定坐标区域

let 裁剪坐标尺寸=[200,100,500,300]; //左上

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

  8.         //二、指定截取坐标尺寸        //=====裁剪部分的坐标尺寸=====//
  9.         let 裁剪坐标尺寸=[200,100,500,300];        //左上宽高
  10.        
  11.         //三、裁剪部分转入内存架图纸,去框架得内存图纸
  12.         let 图纸对象句柄=裁剪框架图纸转图纸(全屏架图纸句柄,裁剪坐标尺寸);

  13.         //四、图纸转入剪贴板
  14.         图纸放入剪贴板(图纸对象句柄);
  15. }
  16. function 裁剪框架图纸转图纸(框架图纸句柄,裁剪坐标尺寸数组){        //返回图纸句柄
  17.         //框架图纸及尺寸        //参数
  18.         console.log("框架图纸句柄:"+框架图纸句柄);
  19.        
  20.         let 切起始左=切横左=裁剪坐标尺寸数组[0],切起始上=切纵上=裁剪坐标尺寸数组[1]
  21.         let 切图像宽=裁剪坐标尺寸数组[2],切图像高=裁剪坐标尺寸数组[3];
  22.         console.log("截图像宽高:("+切图像宽+","+切图像高+")");
  23.        
  24.         //创建(抬出)桌台和(取出)空白纸张
  25.         let 印台图纸句柄=抽取内照框图纸(框架图纸句柄);
  26.         if(印台图纸句柄){console.log("内台图纸创建成功!"+印台图纸句柄);}else{console.log("内台图纸创建失败。");}
  27.         let 图纸对象句柄=抽取内照空白纸(框架图纸句柄,切图像宽,切图像高);        //最后图像存于图纸对象
  28.         if(图纸对象句柄){console.log("创建位图成功!"+图纸对象句柄);}else{console.log("创建位图失败。");}
  29.        
  30.         //台面换上新纸,屏幕图景(拓印)复制到图纸上        //图随纸走
  31.         let 原图纸对象=更换纸笔(印台图纸句柄,图纸对象句柄);
  32.         if(原图纸对象){console.log("成功固定纸张!新:"+图纸对象句柄+" 旧:"+原图纸对象);}else{console.log("固定纸张失败。");}
  33.         //let 拓印=0xCC0020;
  34.         let 部分拓印结果=图纸部分拓印(印台图纸句柄,切图像宽,切图像高,框架图纸句柄,切起始左,切起始上);        //九参
  35.         //let 转印结果=图纸转印(印台图纸句柄,图像宽,图像高,框架图纸句柄);        //十一参
  36.         if(部分拓印结果){console.log("部分拓印成功!"+部分拓印结果);}else{console.log("部分拓印失败。");}
  37.        
  38.         //清理(撤下)画桌和释放(忘记)全屏图景
  39.         let 取下画纸=更换纸笔(印台图纸句柄,原图纸对象);        //释放前操作、或删除前操作
  40.         if(取下画纸){console.log("成功取下画纸!取下:"+取下画纸+" 替换:"+原图纸对象);}else{console.log("取下画纸失败。");}
  41.         let 收纸结果=收起纸笔(原图纸对象);
  42.         if(收纸结果){console.log("对象删除成功!"+收纸结果);}else{console.log("对象删除失败。");}
  43.         let 收内框纸结果=收起内照框图纸(印台图纸句柄);        //此为错误结果:0x800A07DF=-2146826273
  44.         if(收内框纸结果){console.log("删除成功!"+收内框纸结果);}else{console.log("删除失败。");}
  45.         //let 释放画桌=放下框架纸(印台图纸句柄);
  46.         //if(释放画桌){console.log("释放画桌成功!"+释放画桌);}else{console.log("\t释放画桌失败。");}
  47.         let 释放结果=放下框架纸(框架图纸句柄);        //参数清理
  48.         if(释放结果){console.log("释放成功!"+释放结果);}else{console.log("释放失败。");}
  49.        
  50.         //返回(卷起后用)图纸对象
  51.         return 图纸对象句柄;
  52. }
  53. function 图纸放入剪贴板(图纸对象句柄){
  54.         //新图转到剪贴板
  55.         打开剪贴板();清空剪贴板();
  56.         let 位图数据格式=2;
  57.         设置剪贴板(位图数据格式,图纸对象句柄);        //?使用拓印的新白纸句柄会是全黑色
  58.         //设置剪贴板(位图格式,图纸对象句柄);
  59.         关闭剪贴板();
  60. }

  61. function 获取屏幕坐标尺寸(){        //返回宽高数组[屏幕像素宽,屏幕像素高]
  62.         const 执行宏调用=ExecuteExcel4Macro;
  63.         let 屏幕宽度=0,屏幕高度=1;
  64.         let 屏幕像素宽度=获取系统尺寸(屏幕宽度),屏幕像素高度=获取系统尺寸(屏幕高度);
  65.         return [0,0,屏幕像素宽度,屏幕像素高度];
  66. }
  67. function 获取系统尺寸(名称标识){
  68.         const 执行宏调用=ExecuteExcel4Macro;
  69.         let 获取尺寸=执行宏调用(`CALL("User32","GetSystemMetrics","JJ",${名称标识})`);
  70.         return 获取尺寸;
  71. }

  72. function 获取屏幕架图纸(){return 取架图纸(0);}        //屏幕hDC
  73. function 取架图纸(窗口句柄){        //返回框架图纸句柄
  74.         const 执行宏调用=ExecuteExcel4Macro;        //GetDC后ReleaseDC
  75.         let 框架图纸=执行宏调用(`CALL("User32","GetDC","JJ",${窗口句柄})`);        //窗口工作区hDC
  76.         return 框架图纸;
  77. }
  78. function 获取屏幕框图纸(){return 取框图纸(0);}        //主屏幕hDC
  79. function 取框图纸(窗口句柄){        //返回框架图纸句柄
  80.         const 执行宏调用=ExecuteExcel4Macro;
  81.         let 框架图纸=执行宏调用(`CALL("User32","GetWindowDC","JJ",${窗口句柄})`);        //窗口hDC
  82.         return 框架图纸;
  83. }
  84. function 放下框架纸(框架图纸句柄){
  85.         const 执行宏调用=ExecuteExcel4Macro;
  86.         let 释放结果=执行宏调用(`CALL("User32","ReleaseDC","JJJ",0,${框架图纸句柄})`);
  87.         return 释放结果;        //成功1
  88. }

  89. function 抽取内照框图纸(参照框架图纸句柄){        //返回内存框架图纸句柄
  90.         const 执行宏调用=ExecuteExcel4Macro;        //Gdi32.dll        //CreateCompatibleDC后DeleteDC
  91.         let 内存框架图纸=执行宏调用(`CALL("Gdi32","CreateCompatibleDC","JJ",${参照框架图纸句柄})`);
  92.         return 内存框架图纸;
  93. }
  94. function 收起内照框图纸(内存框架图纸句柄){
  95.         const 执行宏调用=ExecuteExcel4Macro;
  96.         let 回收结果=执行宏调用(`CALL("Gdi32","DeleteDC","AJ",${内存框架图纸句柄})`);
  97.         return 回收结果;        //成功true
  98. }

  99. function 取空白纸(纸宽,纸高){        //返回空白图纸句柄
  100.         const 执行宏调用=ExecuteExcel4Macro;                //CreateBitmap后DeleteObject
  101.         let 新空白纸句柄=执行宏调用(`CALL("Gdi32","CreateBitmap","JJJJJJ",${纸宽},${纸高},1,32,0)`);
  102.         return 新空白纸句柄;        //if(新空白纸句柄){console.log("取空白纸成功!");}else{console.log("取空白纸失败。");}
  103. }
  104. function 抽取内照空白纸(参照框架图纸句柄,纸宽,纸高){        //返回内存空白纸句柄
  105.         const 执行宏调用=ExecuteExcel4Macro;        //CreateCompatibleBitmap后DeleteObject
  106.         let 内存空白纸句柄=执行宏调用(`CALL("Gdi32","CreateCompatibleBitmap","JJJJ",${参照框架图纸句柄},${纸宽},${纸高})`);
  107.         return 内存空白纸句柄;
  108. }

  109. function 更换纸笔(框架图纸句柄,新纸笔对象句柄){        //返回原纸笔对象句柄
  110.         const 执行宏调用=ExecuteExcel4Macro;
  111.         let 旧纸笔对象句柄=执行宏调用(`CALL("Gdi32","SelectObject","JJJ",${框架图纸句柄},${新纸笔对象句柄})`);
  112.         return 旧纸笔对象句柄;
  113. }
  114. function 收起纸笔(纸笔对象句柄){
  115.         const 执行宏调用=ExecuteExcel4Macro;
  116.         let 收回结果=执行宏调用(`CALL("Gdi32","DeleteObject","AJ",${纸笔对象句柄})`);
  117.         return 收回结果;        //成功true
  118. }
  119. function 图纸拓印(拓台图纸句柄,图纸宽度,图纸高度,印架图纸句柄){let 拓印=0xCC0020;let 拓印结果=图纸线描(拓台图纸句柄,0,0,图纸宽度,图纸高度,印架图纸句柄,0,0,拓印);return 拓印结果;}
  120. function 图纸部分拓印(拓台图纸句柄,图纸宽度,图纸高度,印架图纸句柄,图纸起始水平,图纸起始垂直){let 拓印=0xCC0020;let 部分拓印结果=图纸线描(拓台图纸句柄,0,0,图纸宽度,图纸高度,印架图纸句柄,图纸起始水平,图纸起始垂直,拓印);return 部分拓印结果;}
  121. function 图纸线描(桌台图纸句柄,白纸起始水平,白纸起始垂直,描宽,描高,架板图纸句柄,图纸起始水平,图纸起始垂直,描手法){
  122.         const 执行宏调用=ExecuteExcel4Macro;        //框架印向桌台        //动作为拓印
  123.         let 线描结果=执行宏调用(`CALL("Gdi32","BitBlt","AJJJJJJJJJ",${桌台图纸句柄},${白纸起始水平},${白纸起始垂直},${描宽},${描高},${架板图纸句柄},${图纸起始水平},${图纸起始垂直},${描手法})`);
  124.         return 线描结果;        //成功true
  125. }
  126. function 图纸转印(拓台图纸句柄,图纸宽度,图纸高度,印架图纸句柄){let 转印=0xCC0020;let 转印结果=图纸涂绘(拓台图纸句柄,0,0,图纸宽度,图纸高度,印架图纸句柄,0,0,图纸宽度,图纸高度,转印);return 转印结果;}
  127. function 图纸涂绘(桌台图纸句柄,白纸起始水平,白纸起始垂直,绘宽,绘高,架板图纸句柄,图纸起始水平,图纸起始垂直,图纸宽度,图纸高度,绘手法){
  128.         const 执行宏调用=ExecuteExcel4Macro,转印=0xCC0020;        //框架印向桌台        //动作转印同拓印
  129.         let 涂绘结果=执行宏调用(`CALL("Gdi32","StretchBlt","AJJJJJJJJJJJ",${桌台图纸句柄},${白纸起始水平},${白纸起始垂直},${绘宽},${绘高},${架板图纸句柄},${图纸起始水平},${图纸起始垂直},${图纸宽度},${图纸高度},${绘手法})`);
  130.         return 涂绘结果;        //成功true
  131. }

  132. function 打开剪贴板(){
  133.         const 执行宏调用=ExecuteExcel4Macro;
  134.         let 打开结果=执行宏调用(`CALL("User32","OpenClipboard","AJ",0)`);
  135.         return 打开结果;        //if(打开结果){console.log("成功打开剪贴板!");}else{console.log("剪贴板打开失败。");}
  136. }
  137. function 清空剪贴板(){
  138.         const 执行宏调用=ExecuteExcel4Macro;
  139.         let 清空结果=执行宏调用(`CALL("User32","EmptyClipboard","A")`);
  140.         return 清空结果;        //if(清空结果){console.log("成功清空剪贴板!");}else{console.log("剪贴板清空失败。");}
  141. }
  142. function 设置剪贴板(数据格式,数据句柄){
  143.         const 执行宏调用=ExecuteExcel4Macro;        //数据格式:位图2 文本1 统一文本0xD=13
  144.         let 数据内存句柄=执行宏调用(`CALL("User32","SetClipboardData","JJJ",${数据格式},${数据句柄})`);
  145.         return 数据内存句柄;        //if(数据内存句柄){console.log("成功设置剪贴板!");}else{console.log("剪贴板设置失败。");}
  146. }
  147. function 关闭剪贴板(){
  148.         const 执行宏调用=ExecuteExcel4Macro;
  149.         let 关闭结果=执行宏调用(`CALL("User32","CloseClipboard","A")`);
  150.         return 关闭结果;        //if(关闭结果){console.log("成功关闭剪贴板!");}else{console.log("剪贴板关闭失败。");}
  151. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-5-21 07:24

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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