|
|
调用WinAPI的小功能代码
一个一个小功能
- function 设置剪贴板文本(文本内容){ //参数为字符串
- let 执行宏调用=ExecuteExcel4Macro; //调用系统应用接口。简化书写
- if (执行宏调用(`CALL("User32","OpenClipboard","AJ",0)`)){ //打开剪贴板
- if(执行宏调用(`CALL("User32","EmptyClipboard","A")`)){ //清空剪切板
- const 内存句柄=字符串到内存(文本内容); /*-----调用函数-----*/
- if(内存句柄){ //console.log("内存块大小:"+执行宏调用(`CALL("Kernel32","GlobalSize","JJ",${内存句柄})`));
- let 剪贴板文本=执行宏调用(`CALL("User32","SetClipboardData","JJJ",1,${内存句柄})`);
- 执行宏调用(`CALL("Kernel32","GlobalFree","JJ",${内存句柄})`); //释放内存
- }else{console.log("未能分配内存!");} //数据放入剪切板,参数为1(CF_TEXT)则返回文本
- }else{console.log('未能清空剪贴板!');}
- 执行宏调用(`CALL("User32","CloseClipboard","A")`); //关闭剪贴板,以释放控制权。
- }else{alert('无法打开剪贴板!');}
- }
- function 获取剪贴板文本(){ //返回字符串
- const 执行宏调用=ExecuteExcel4Macro;
- if(执行宏调用(`CALL("User32","OpenClipboard","JJ",0)`)){ //打开剪贴板
- const 内存句柄=执行宏调用(`CALL("User32","GetClipboardData","JJ",1)`); //获取剪贴板文本,返回句柄。
- if(内存句柄){ //锁定全局内存对象,获取内存地址
- var 剪贴板文本=内存取字符串(内存句柄); /*-----调用函数-----*/
- }else{console.log("未能获取剪贴板数据的内存句柄!");}
- 执行宏调用(`CALL("User32","CloseClipboard","J")`); //关闭剪贴板,让其它应用可以使用剪贴板
- return 剪贴板文本; //返回字符串
- }else{alert('无法打开剪贴板!');}
- }
- function 字符串到内存(字符串){ //返回内存句柄
- const 执行宏调用=ExecuteExcel4Macro;
- let 分段文本=[],分段字节=[],总字节=0,段长度=127; //可申请256字节内存,结束符1字节,汉字最长127
- for(let 起始=i=0;起始<字符串.length;起始+=段长度,i++){
- 分段文本.push(字符串.slice(起始,起始+段长度));
- 分段字节.push(分段文本[i].replace(/[^\x00-\xff]/g,'xx').length); //一个汉字占两个字节
- 总字节+=分段字节[i];
- } //分配内存 //分配GlobalAlloc对应销毁GlobalFree //分配LocalAlloc对应销毁LocalFree
- const 内存句柄=执行宏调用(`CALL("Kernel32","GlobalAlloc","JJJ",${0x42},${总字节+1})`);
- if(内存句柄){ //内存分配成功,然后锁写解内存。 //锁定全局内存对象,会返回其内存地址
- const 内存地址=执行宏调用(`CALL("Kernel32","GlobalLock","JJ",${内存句柄})`);
- for(let 偏移字节=i=0;i<分段文本.length;i++){ //字符串(JS变量)分批复制到刚申请的内存中。分批是因为有限长
- 执行宏调用(`CALL("Kernel32","lstrcpynW","JJFJ",${内存地址+偏移字节},"${分段文本[i].replace(/\"/g,'\"\"')}",${分段字节[i]})`);
- 偏移字节+=分段字节[i]; //返回地址J。 //字符串中含双引号出错,因此替换成单引号
- }
- 执行宏调用(`CALL("Kernel32","GlobalUnlock","JJ",${内存句柄})`); //解锁全局内存对象,以释放资源
- return 内存句柄;
- }else{console.log("未能分配内存!");}
- }
- function 内存取字符串(内存句柄){ //返回字符串
- const 执行宏调用=ExecuteExcel4Macro,段长度=127;
- const 内存地址=执行宏调用(`CALL("Kernel32","GlobalLock","JJ",${内存句柄})`); //锁定,获取内存地址
- if(内存地址){
- const 总字节=执行宏调用(`CALL("Kernel32","lstrlenA","JJ",${内存地址})`); //内存文本字节数
- let 偏移字节=0,文本字符串=分段文本='';
- while(偏移字节<总字节){ //返回字符串F。 //返回超255字节时,也需要分段操作
- 分段文本=执行宏调用(`CALL("Kernel32","lstrcpynW","FFJJ","",${内存地址+偏移字节},${段长度})`);
- //偏移字节+=执行宏调用(`CALL("Kernel32","lstrlenA","JC","${分段文本.replace(/["\n]/g,'x')}")`);
- 偏移字节+=分段文本.replace(/[^\x00-\xff]/g,'xx').length; //计算字符串字节数
- //偏移字节+=执行宏调用(`LENB("${分段文本.replace(/"/g,'x')}")`);
- 文本字符串+=分段文本;
- } //解锁全局内存对象,以释放资源
- 执行宏调用(`CALL("Kernel32","GlobalUnlock","JJ",${内存句柄})`);
- return 文本字符串;
- }else{console.log("未找到内存地址!");}
- }
复制代码 |
|