|
|
截取鼠标所指窗口图像放入剪贴板
本帖最后由 cutebe 于 2026-5-18 17:16 编辑
鼠标指针所指窗口
- function 截取窗口图像放入剪贴板测试(){ //鼠标指针所指窗口截图
- console.clear();
- //一、获取鼠标指向窗口框架图纸
- let 窗口句柄=鼠标所指窗口句柄();
- let 窗口坐标=获取窗口坐标(窗口句柄);
- let 窗口宽=窗口坐标[2]-窗口坐标[0],窗口高=窗口坐标[3]-窗口坐标[1];
- console.log("窗口坐标尺寸:("+窗口宽+","+窗口高+")"+窗口坐标);
- let 窗框图纸句柄=取框图纸(窗口句柄);
- console.log("窗口框架图纸句柄:"+窗框图纸句柄);
- //二、转入内存框架图纸,去框架得内存图纸(通过更换纸张)
- let 图纸对象句柄=框架图纸转图纸(窗框图纸句柄,窗口坐标);
- //三、图纸转入剪贴板
- 图纸放入剪贴板(图纸对象句柄);
- }
- function 鼠标所指窗口句柄(){ //返回窗口句柄
- const 执行宏调用=ExecuteExcel4Macro;
- let 鼠标指针坐标=获取鼠标位置(); //===调用函数===//
- let 水平=鼠标指针坐标[0],垂直=鼠标指针坐标[1]; //鼠标指针处窗口句柄 //扩展了一个参数
- let 窗口句柄=执行宏调用(`CALL("User32", "WindowFromPoint", "JJJ", ${水平},${垂直})`);
- return 窗口句柄;
- }
- function 获取鼠标位置(){ //屏幕左上角开始,向右为x,向下为y
- const 执行宏调用=ExecuteExcel4Macro;
- let 坐标数据=执行宏调用(`CALL("User32","GetCursorPos","1E",0)`);
- const 缓冲区=new ArrayBuffer(8); //8字节对应64位
- const 数据操作=new DataView(缓冲区); //操作对象
- 数据操作.setFloat64(0,坐标数据); //(操作)写入64位数
- let 坐标=[];
- 坐标[0]=数据操作.getInt32(4); //取32位坐标x
- 坐标[1]=数据操作.getInt32(0); //取32位坐标y
- return 坐标; //返回坐标数组
- }
- function 获取窗口坐标(窗口句柄){ //返回坐标数组:左上右下
- const 执行宏调用=ExecuteExcel4Macro;
- let 坐标内存地址=申请虚拟内存(16);
- let 结果=执行宏调用(`CALL("User32","GetWindowRect","JJJ",${窗口句柄},${坐标内存地址})`);
- let 坐标数组=内存读取数组(坐标内存地址,4); //返回坐标数组:左上右下
- 释放虚拟内存(坐标内存地址);
- return 坐标数组;
- }
- function 内存读取数组(内存地址,数组长度){ //返回数组
- const 执行宏调用=ExecuteExcel4Macro;
- let 数据数组=[],读取字节=4;
- for(let 偏移=i=0;i<数组长度;i++){ //库Kernel32.dll和NtDll.dll里都有RtlMoveMemory
- 读出数据=执行宏调用(`CALL("Kernel32","RtlMoveMemory","1NJJ",${内存地址},${内存地址+偏移},${读取字节})`); //读出
- 数据数组.push(读出数据);偏移+=读取字节;
- }
- 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,重绘=0xF; //WM_PAINT=0xF
- let 结果=执行宏调用(`CALL("User32", "SendMessageA", "JJJJJ", ${窗口句柄},${重绘},0,0)`);
- console.log("窗口重绘消息执行结果:"+结果);
- }
- function 框架图纸转图纸(框架图纸句柄,坐标尺寸数组){ //返回图纸句柄
- //框架图纸及尺寸
- console.log("框架图纸句柄:"+框架图纸句柄);
- let 起始左=横左=坐标尺寸数组[0],起始上=纵上=坐标尺寸数组[1],横右=坐标尺寸数组[2],纵下=坐标尺寸数组[3];
- let 图像宽=横右-横左,图像高=纵下-纵上;
- console.log("图像宽高:("+图像宽+","+图像高+")");
-
- //抬出桌台和取出空白纸张
- let 印台图纸句柄=抽取内照框图纸(框架图纸句柄);
- if(印台图纸句柄){console.log("内台图纸创建成功!"+印台图纸句柄);}else{console.log("内台图纸创建失败。");}
- let 图纸对象句柄=抽取内照空白纸(框架图纸句柄,图像宽,图像高); //白纸用于承图
- if(图纸对象句柄){console.log("取空白纸成功!"+图纸对象句柄);}else{console.log("创建位图失败。");}
-
- //台面换上新纸,供拓印图像用 //图随纸走
- let 原图纸对象=更换纸笔(印台图纸句柄,图纸对象句柄);
- if(原图纸对象){console.log("成功更换纸张!新:"+图纸对象句柄+" 旧:"+原图纸对象);}else{console.log("更换纸张失败。");}
- let 拓印结果=图纸拓印(印台图纸句柄,图像宽,图像高,框架图纸句柄); //九参
- if(拓印结果){console.log("拓印成功!"+拓印结果);}else{console.log("拓印失败。");}
- //let 转印结果=图纸转印(印台图纸句柄,图像宽,图像高,框架图纸句柄); //十一参
- //if(转印结果){console.log("转印成功!"+转印结果);}else{console.log("转印失败。");}
-
- //收桌板及纸(清理)
- let 取下画纸=更换纸笔(印台图纸句柄,原图纸对象); //取下的画纸=图纸对象,最后要用
- if(取下画纸){console.log("成功取下画纸!取下(要用):"+取下画纸+" 替换成:"+原图纸对象);}else{console.log("取下画纸失败。");}
- let 收纸结果=收起纸笔(原图纸对象);
- if(收纸结果){console.log("空纸回收成功!"+收纸结果);}else{console.log("图纸对象删除失败。");}
- let 收内框纸结果=收起内照框图纸(印台图纸句柄); //错误(返回值)结果:0x800A07DF=-2146826273
- if(收内框纸结果){console.log("成功收起内桌台!"+收内框纸结果);}else{console.log("内桌台删除失败。");}
- let 释放结果=放下框架纸(框架图纸句柄); //参数清理
- if(释放结果){console.log("框架图纸收回成功!"+释放结果);}else{console.log("释放失败。");}
-
- //返回(卷起)图纸对象
- return 图纸对象句柄;
- }
- function 图纸放入剪贴板(图纸对象句柄){
- 打开剪贴板();清空剪贴板();
- let 位图数据格式=2;
- 设置剪贴板(位图数据格式,图纸对象句柄); //图纸放入剪贴板(归剪贴板管理,无需手工回收)
- 关闭剪贴板();
- }
- function 获取屏幕架图纸(){return 取架图纸(0);} //屏幕hDC
- function 取架图纸(窗口句柄){ //返回框架图纸句柄
- const 执行宏调用=ExecuteExcel4Macro; //GetDC后ReleaseDC
- let 框架图纸=执行宏调用(`CALL("User32","GetDC","JJ",${窗口句柄})`); //窗口工作区hDC
- return 框架图纸;
- }
- function 获取屏幕框图纸(){return 取框图纸(0);} //主屏幕hDC
- function 取框图纸(窗口句柄){ //返回框架图纸句柄
- const 执行宏调用=ExecuteExcel4Macro;
- 发送窗口重绘消息(窗口句柄);
- let 框架图纸=执行宏调用(`CALL("User32","GetWindowDC","JJ",${窗口句柄})`); //窗口hDC
- return 框架图纸;
- }
- function 放下框架纸(框架图纸句柄){
- const 执行宏调用=ExecuteExcel4Macro;
- let 释放结果=执行宏调用(`CALL("User32","ReleaseDC","JJJ",0,${框架图纸句柄})`);
- return 释放结果; //成功1
- }
- function 抽取内照框图纸(参照框架图纸句柄){ //返回内存框架图纸句柄
- const 执行宏调用=ExecuteExcel4Macro; //Gdi32.dll //CreateCompatibleDC后DeleteDC
- let 内存框架图纸=执行宏调用(`CALL("Gdi32","CreateCompatibleDC","JJ",${参照框架图纸句柄})`);
- return 内存框架图纸;
- }
- function 收起内照框图纸(内存框架图纸句柄){
- const 执行宏调用=ExecuteExcel4Macro;
- let 回收结果=执行宏调用(`CALL("Gdi32","DeleteDC","AJ",${内存框架图纸句柄})`);
- return 回收结果; //成功true
- }
- function 取空白纸(纸宽,纸高){ //返回空白图纸句柄
- const 执行宏调用=ExecuteExcel4Macro; //CreateBitmap后DeleteObject
- let 新空白纸句柄=执行宏调用(`CALL("Gdi32","CreateBitmap","JJJJJJ",${纸宽},${纸高},1,32,0)`);
- return 新空白纸句柄; //if(新空白纸句柄){console.log("取空白纸成功!");}else{console.log("取空白纸失败。");}
- }
- function 抽取内照空白纸(参照框架图纸句柄,纸宽,纸高){ //返回内存空白纸句柄
- const 执行宏调用=ExecuteExcel4Macro; //CreateCompatibleBitmap后DeleteObject
- let 内存空白纸句柄=执行宏调用(`CALL("Gdi32","CreateCompatibleBitmap","JJJJ",${参照框架图纸句柄},${纸宽},${纸高})`);
- return 内存空白纸句柄;
- }
- function 更换纸笔(框架图纸句柄,新纸笔对象句柄){ //返回原纸笔对象句柄
- const 执行宏调用=ExecuteExcel4Macro;
- let 旧纸笔对象句柄=执行宏调用(`CALL("Gdi32","SelectObject","JJJ",${框架图纸句柄},${新纸笔对象句柄})`);
- return 旧纸笔对象句柄;
- }
- function 收起纸笔(纸笔对象句柄){
- const 执行宏调用=ExecuteExcel4Macro;
- let 收回结果=执行宏调用(`CALL("Gdi32","DeleteObject","AJ",${纸笔对象句柄})`);
- return 收回结果; //成功true
- }
- function 图纸拓印(拓台图纸句柄,图纸宽度,图纸高度,印架图纸句柄){let 拓印=0xCC0020;let 拓印结果=图纸线描(拓台图纸句柄,0,0,图纸宽度,图纸高度,印架图纸句柄,0,0,拓印);return 拓印结果;}
- function 图纸线描(桌台图纸句柄,白纸起始水平,白纸起始垂直,描宽,描高,架板图纸句柄,图纸起始水平,图纸起始垂直,描手法){
- const 执行宏调用=ExecuteExcel4Macro; //框架印向桌台 //动作为拓印
- let 线描结果=执行宏调用(`CALL("Gdi32","BitBlt","AJJJJJJJJJ",${桌台图纸句柄},${白纸起始水平},${白纸起始垂直},${描宽},${描高},${架板图纸句柄},${图纸起始水平},${图纸起始垂直},${描手法})`);
- return 线描结果; //成功true
- }
- function 图纸转印(拓台图纸句柄,图纸宽度,图纸高度,印架图纸句柄){let 转印=0xCC0020;let 转印结果=图纸涂绘(拓台图纸句柄,0,0,图纸宽度,图纸高度,印架图纸句柄,0,0,图纸宽度,图纸高度,转印);return 转印结果;}
- function 图纸涂绘(桌台图纸句柄,白纸起始水平,白纸起始垂直,绘宽,绘高,架板图纸句柄,图纸起始水平,图纸起始垂直,图纸宽度,图纸高度,绘手法){
- const 执行宏调用=ExecuteExcel4Macro,转印=0xCC0020; //框架印向桌台 //动作转印同拓印
- let 涂绘结果=执行宏调用(`CALL("Gdi32","StretchBlt","AJJJJJJJJJJJ",${桌台图纸句柄},${白纸起始水平},${白纸起始垂直},${绘宽},${绘高},${架板图纸句柄},${图纸起始水平},${图纸起始垂直},${图纸宽度},${图纸高度},${绘手法})`);
- return 涂绘结果; //成功true
- }
- function 打开剪贴板(){
- const 执行宏调用=ExecuteExcel4Macro;
- let 打开结果=执行宏调用(`CALL("User32","OpenClipboard","AJ",0)`);
- return 打开结果; //if(打开结果){console.log("成功打开剪贴板!");}else{console.log("剪贴板打开失败。");}
- }
- function 清空剪贴板(){
- const 执行宏调用=ExecuteExcel4Macro;
- let 清空结果=执行宏调用(`CALL("User32","EmptyClipboard","A")`);
- return 清空结果; //if(清空结果){console.log("成功清空剪贴板!");}else{console.log("剪贴板清空失败。");}
- }
- function 设置剪贴板(数据格式,数据句柄){
- const 执行宏调用=ExecuteExcel4Macro; //数据格式:位图2 文本1 统一文本0xD=13
- let 数据内存句柄=执行宏调用(`CALL("User32","SetClipboardData","JJJ",${数据格式},${数据句柄})`);
- return 数据内存句柄; //if(数据内存句柄){console.log("成功设置剪贴板!");}else{console.log("剪贴板设置失败。");}
- }
- function 关闭剪贴板(){
- const 执行宏调用=ExecuteExcel4Macro;
- let 关闭结果=执行宏调用(`CALL("User32","CloseClipboard","A")`);
- return 关闭结果; //if(关闭结果){console.log("成功关闭剪贴板!");}else{console.log("剪贴板关闭失败。");}
- }
复制代码
|
|