前言
本文程序是基于作者另一篇文章的程序基础上做修改,链接:(17条消息) C语言学习:除去剪切板内容的换行与回车_余宁C的博客-CSDN博客
由于剪切板中普通的text数据是8位的,不能支持一些字符的转换,这样就会导致粘贴出的内容出现许多的问号??????,比如粘贴上下标的符号,因此我们需要使用UNICODETEXT来解决这个问题。
上源码
#include <stdio.h>
#include <stdlib.h>/*提供malloc()等函数原型*/
#include <Windows.h>/*提供剪切板相关函数原型*/
#include <unistd.h>/*提供睡眠函数原型*/
/*将字符串写入到剪切板*/
int set_clipboard(const short *data) {/*使用const前缀防止此函数修改原文,传入的参数是数据首地址*/
HGLOBAL hMemory;/* HGLOBAL 等于 void * ; 此变量用于指向剪切板内存 */
short * lpMemory;/*LPTSTR类型是 char*的别名,因此需要换成两个字节的 */
/*1.打开剪切板 */
if (!OpenClipboard(NULL)) return 0;
/*2.清空剪切板*/
if (!EmptyClipboard()) return 0;
/*3.为剪切板分配内存,相当于我们拿一块地提供给剪切板使用 */
if (!(hMemory = GlobalAlloc(GMEM_MOVEABLE, 20000))) return 0;
/*4.锁定内存区域 (获得内存地址)*/
if (!(lpMemory = (short *)GlobalLock(hMemory))) return 0;
// printf("hMemory:%p ; lpMemory:%p \n",hMemory,lpMemory);/*观察得到两个地址是不一样的*/
/*5.复制数据到内存区域 */
memcpy_s(lpMemory, 20000, data, 20000);
/*6.解除内存锁定 */
GlobalUnlock(hMemory);
/*7.设置剪切板数据格式*/
if (!SetClipboardData(CF_UNICODETEXT, hMemory)) return 0;
/*8.关闭剪切板,防止剪切板异常 */
CloseClipboard();
return 1;/*如果成功执行,我们返回1,以后好用作判断条件*/
}
/*提取并处理剪切板数据,处理好的数据传入data空间*/
char clipbar_process(short *data){
short *clip_ptr;
int i = 0;
/*1.判断剪贴板的数据格式是否支持所指定的类型*/
if (!IsClipboardFormatAvailable(CF_UNICODETEXT))
return 0;
/*2.打开剪切板 */
if (!OpenClipboard(NULL))
return 0;
/*3.获取所指定类型的数据*/
HGLOBAL lpMemory = GetClipboardData(CF_UNICODETEXT);
/*4.锁定内存区域 (获得内存地址)*/
if (!(clip_ptr = (short *)GlobalLock(lpMemory)))
return 0;/*此时clip_ptr指向了剪切板内存区,因此我们可以开始读取*/
/*5.复制剪切板内容到指定空间*/
while(1){
if(*clip_ptr == 0){/*读到剪切板末尾,退出循环*/
data[i] = 0;/*注意:这里写入0,0一般表示文件或文本末尾*/
break;
}
if(i>=19999){/*超长了*/
data[i] = 0;
break;
}
if( (*clip_ptr == 10) || (*clip_ptr == 13) ){/*判断是否回车或换行符*/
data[i] = 32;/*写入空格*/
}
else{
data[i] = *clip_ptr;/*复制剪切板内容到空间*/
}
clip_ptr++;
i++;
}
/*6.关闭剪切板,防止剪切板异常*/
CloseClipboard();
return 1;/*成功处理剪切板*/
}
int main() {
/*1.分配一片连续的内存供内容修改缓存*/
short content[20000];
/*2.循环处理剪切板内容*/
while(1){
/*处理剪切板内容*/
if(clipbar_process(content)) /*提取并处理剪切板的数据到指定内存*/
{
set_clipboard(content);/*粘贴到剪切板*/
}
/*小睡一下,减少CPU占用*/
sleep(1);/*睡眠1s*/
}
return 0;
}
讲解
可以看到我们只是将某些变量的类型改为了short类型,unicode码是两个字节的,short也是两个字节,执行效果不再赘述,详情请看前言放上的链接内容。