C语言学习:除去剪切板内容的换行与回车

前言

我们在复制PDF文件文本内容的时候,常常为文本中多了些换行符而困扰,所以作者特地制作一个程序解决这个问题。

程序说明

作者为博主:余宁C

  1. 程序自动将剪切板中的回车或者换行替换为空格,每1s执行一次
  2. 如果剪切板内容不是文本(如图片)将不会对其进行处理
  3. 使用时将程序    高高挂起,事不关己

程序使用情况

1.复制pdf内容

2.粘贴到百度翻译的效果

 3.不使用此程序时粘贴到百度翻译的效果

 

 

参考资料

  1. 让程序睡眠以降低CPU占用率:C语言的sleep、usleep、nanosleep等休眠函数的了解与用法_拥抱Linux的博客-CSDN博客_c usleep
  2. 读取和写入剪切板内容:1.Windows 剪切板API详解 - 蓝雨麦郎 - 博客园 (cnblogs.com);2.(27条消息) C语言-剪切板使用_dandelionLYY的博客-CSDN博客_c语言获取剪切板

程序源码

#include <stdio.h>
#include <stdlib.h>/*提供malloc()等函数原型*/
#include <Windows.h>/*提供剪切板相关函数原型*/
#include <unistd.h>/*提供睡眠函数原型*/

/*将字符串写入到剪切板*/
int set_clipboard(const char *data) {/*使用const前缀防止此函数修改原文,传入的参数是数据首地址*/
	int contentSize = strlen(data) + 1;/*文本数据长度,不只是字符串长度*/
	
	HGLOBAL hMemory;/* HGLOBAL 等于 void * ; 此变量用于指向剪切板内存   */
	LPTSTR lpMemory;/* LPTSTR 等于 char *  ; 此变量也是指向剪切板内存  */
	
	/*1.打开剪切板 */
	if (!OpenClipboard(NULL))	return 0;
	/*2.清空剪切板*/	
	if (!EmptyClipboard())	return 0;
	/*3.为剪切板分配内存,相当于我们拿一块地提供给剪切板使用 */	
	if (!(hMemory = GlobalAlloc(GMEM_MOVEABLE, contentSize)))	return 0;
	/*4.锁定内存区域 (获得内存地址)*/	
	if (!(lpMemory = (LPTSTR)GlobalLock(hMemory)))	return 0;	
//	printf("hMemory:%p ; lpMemory:%p \n",hMemory,lpMemory);/*观察得到两个地址是不一样的*/ 
	/*5.复制数据到内存区域 */	
	memcpy_s(lpMemory, contentSize, data, contentSize);   

	/*6.解除内存锁定 */
	GlobalUnlock(hMemory);
	/*7.设置剪切板数据格式*/
	if (!SetClipboardData(CF_TEXT, hMemory))	return 0; 

	/*8.关闭剪切板,防止剪切板异常 */
	CloseClipboard();
	
	return 1;/*如果成功执行,我们返回1,以后好用作判断条件*/
}


/*提取并处理剪切板数据,处理好的数据传入data空间*/
char clipbar_process(char *data){
	char *clip_ptr; 
	int i = 0;
	 
	/*1.判断剪贴板的数据格式是否支持所指定的类型*/
	if (!IsClipboardFormatAvailable(CF_TEXT))
		return 0;
		
	/*2.打开剪切板 */
	if (!OpenClipboard(NULL))
		return 0; 
		
	/*3.获取所指定类型的数据*/
	HGLOBAL lpMemory = GetClipboardData(CF_TEXT); 
	
	/*4.锁定内存区域 (获得内存地址)*/
	if (!(clip_ptr = (char *)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.分配一片连续的内存供内容修改缓存*/
	char *content;
	content = malloc(20000);/*分配一片连续的内存*/
/*	
    替代方案:
	char content[20000]; 
*/	
		
	/*2.循环处理剪切板内容*/
	while(1){
		/*处理剪切板内容*/
		if(clipbar_process(content)) /*提取并处理剪切板的数据到指定内存*/
		{
			set_clipboard(content);/*粘贴到剪切板*/	
		}
		/*小睡一下,减少CPU占用*/
		sleep(1);/*睡眠1s*/
	}
	
	free(content);/*释放掉该指针指向的内存区域,与malloc对应使用*/
	return 0;
}

程序注意事项

  1. 文本内容需要添加结束符 '\0' , ASCLL码值为0;
  2. 关于睡眠,作者原本使用 usleep(500);  用以让系统睡眠0.5s(文中代码是 sleep(1); 睡眠1s),可是作者发现程序运行时CPU使用率达到50%,而使用 sleep(1);  时CPU占用率只有10%不到;
    		sleep(1);/*睡眠1s*/
  3. 作者在源码使用分配内存的方式提供复制剪切板的缓存,而不是直接使用数组作为缓存,因为作者想玩,想绕远路罢了;
    	char *content;
    	content = malloc(20000);/*分配一片连续的内存*/
    	free(content);/*释放掉该指针指向的内存区域,与malloc对应使用*/
  4. 注意剪切板有多种不同的格式,可以在头文件中看到,因此代码在分析剪切板的时候数据格式不对,相关函数就不会执行,相当于跳过,借此特性作为条件判断可以达到只对文本操作的目的,而对图片等其他格式没有影响

主程序:

//主程序:
		if(clipbar_process(content)) /*提取并处理剪切板的数据到指定内存*/
		{
			set_clipboard(content);/*粘贴到剪切板*/	
		}

函数失效的来源--return 0;

	if (!IsClipboardFormatAvailable(CF_TEXT))
		return 0;

剪切板的格式

#ifndef NOCLIPBOARD

#define CF_TEXT 1
#define CF_BITMAP 2
#define CF_METAFILEPICT 3
#define CF_SYLK 4
#define CF_DIF 5
#define CF_TIFF 6
#define CF_OEMTEXT 7
#define CF_DIB 8
#define CF_PALETTE 9
#define CF_PENDATA 10
#define CF_RIFF 11
#define CF_WAVE 12
#define CF_UNICODETEXT 13
#define CF_ENHMETAFILE 14
#define CF_HDROP 15
#define CF_LOCALE 16
#define CF_DIBV5 17
#define CF_MAX 18

#define CF_OWNERDISPLAY 0x0080
#define CF_DSPTEXT 0x0081
#define CF_DSPBITMAP 0x0082
#define CF_DSPMETAFILEPICT 0x0083
#define CF_DSPENHMETAFILE 0x008E

#define CF_PRIVATEFIRST 0x0200
#define CF_PRIVATELAST 0x02FF

#define CF_GDIOBJFIRST 0x0300
#define CF_GDIOBJLAST 0x03FF
#endif

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值