|
|
本帖最后由 cutebe 于 2026-3-24 17:02 编辑
使用方法 //JS代码,WPS的JS宏
- var 剪贴板文本=获取剪贴板文本();
- var 修改文本="新文本:\n"+ 剪贴板文本 +"\n字符串结束!";
- 设置剪贴板文本(修改文本); //新文本放入剪贴板,可粘贴使用
复制代码
设置剪贴板文本("字符串");
- function 设置剪贴板文本(文本内容){ //文本内容 需要复制到剪贴板的文本
- let 执行宏调用=ExecuteExcel4Macro; //调用系统应用接口。简化书写
- //在ExecuteExcel4Macro中调用CALL,限制字符串类型参数的长度小于等于255。 //一个汉字占2个字节
- //let 文本字节长度 = 执行宏调用(`CALL("kernel32","lstrlenA","JF","${文本内容}")`); //参数为字符串引号包起 //字符串变量参数,类型必须用F,用C则出错。
- //let 文本字节长度 = 执行宏调用(`CALL("Kernel32","lstrlenA","JJ",${内存地址})`); //参数为(字符串的)内存地址指针时不限制
- let 分段文本=[],段长度=127,分段长=[],总字节=0; //每段最长256字节,去掉结束符\0,双字节文字最长127
- for(let i=0;i<文本内容.length;i+=段长度){
- 分段文本.push(文本内容.slice(i,i+段长度));
- }
- for(let i=0;i<分段文本.length;i++){ //字符串长度length,不同于字节长度
- 分段长[i]=执行宏调用(`CALL("kernel32","lstrlenA","JF","${分段文本[i]}")`); //计算字符串字节长度(参数为JS字符串变量时,字符串最大255字节。)
- 总字节+=分段长[i]; //console.log("分段文本 "+分段长[i]+":"+分段文本[i]);
- }
- let 内存句柄,内存地址,剪贴板文本; //console.clear(); //清空立即窗口(控制台)信息
- if (执行宏调用(`CALL("user32.dll","OpenClipboard","AJ",0)`)){ //打开剪贴板
- if(执行宏调用(`CALL("user32.dll","EmptyClipboard","A")`)){ //清空剪切板
- 内存句柄=执行宏调用(`CALL("Kernel32","GlobalAlloc","JJJ",${0x00000002},${总字节+1})`); //在堆中分配可移动内存
- //console.log("内存块大小:"+执行宏调用(`CALL("Kernel32","GlobalSize","JJ",${内存句柄})`)); //查看分配的内存块的大小
- if(内存句柄){ //内存分配成功。然后锁定(写的)内存对象,字符串复制到(写入)内存,解锁。最后设置剪贴板。
- 内存地址=执行宏调用(`CALL("kernel32.dll","GlobalLock","JJ",${内存句柄})`); //锁定全局内存对象,获取指向内存句柄的(内存块指针)内存地址
- let 偏移字节=0; //将文本复制至 锁定全局内存对象 //字符串变量必须用双引号引上。类型必须用F
- for(let i=0;i<分段文本.length;i++){ //字符串(JS变量)分批复制到刚申请的内存中。分批是因为有限长
- 执行宏调用(`CALL("kernel32.dll","lstrcpynW","JJFJ",${内存地址+偏移字节},"${分段文本[i]}",${分段长[i]})`);
- 偏移字节+=分段长[i]; //第二个参数为字符串时返回的是地址。
- }
- 执行宏调用(`CALL("kernel32.dll","GlobalUnlock","JJ",${内存句柄})`); //解锁全局内存对象,以释放资源
- //数据放入剪切板,参数为1则返回文本
- 剪贴板文本=执行宏调用(`CALL("user32.dll","SetClipboardData","JJJ",1,${内存句柄})`); //仅设置剪贴板文本:参数CF_TEXT=1
- }else{console.log("未能分配内存!");}
- }else{console.log('未能清空剪贴板!');}
- 执行宏调用(`CALL("user32.dll","CloseClipboard","A")`); //关闭剪贴板,以释放控制权。(让其它应用可以使用剪贴板)
- }else{alert('无法打开剪贴板!');}
- }
复制代码
获取剪贴板文本();
- function 获取剪贴板文本() {//获取剪贴板文本,只能获取255字节内容
- let 内存句柄,内存地址,剪贴板文本="";
- let 执行宏调用=ExecuteExcel4Macro; //简化代码书写
- if(执行宏调用(`CALL("user32.dll","OpenClipboard","JJ",0)`)){ //打开剪贴板
- 内存句柄=执行宏调用(`CALL("user32.dll","GetClipboardData","JJ",1)`); //获取剪贴板数据,返回剪贴板数据的内存块句柄。只取剪贴板中文本:CF_TEXT=1
- if(内存句柄){
- 内存地址=执行宏调用(`CALL("kernel32.dll","GlobalLock","JJ",${内存句柄})`); //锁定全局内存对象,获取指向内存句柄的(内存块指针)内存地址
- let 总字节,偏移字节=0,段字节=127,分段文本='';
- 总字节=执行宏调用(`CALL("Kernel32","lstrlenA","JJ",${内存地址})`); //剪贴板文本字节数
- while(偏移字节<总字节){ //第二个参数为地址时,返回字符串。返回值超256字节时,也需要分段操作
- 分段文本=执行宏调用(`CALL("Kernel32","lstrcpynW","FFJJ","",${内存地址+偏移字节},${段字节})`); //分批获取超256字节的文本
- 偏移字节+=段字节;剪贴板文本+=分段文本;
- }
- 执行宏调用(`CALL("kernel32.dll","GlobalUnlock","JJ",${内存句柄})`); //解锁全局内存对象,使内存可以回收
- }else{console.log("未能获取剪贴板数据的内存句柄!");}
- 执行宏调用(`CALL("user32.dll","CloseClipboard","J")`); //关闭剪贴板
- return 剪贴板文本; //返回字符串
- }else{alert('无法打开剪贴板!');}
- }
复制代码
|
|