C语言学习:除去剪切板内容的换行与回车 您所在的位置:网站首页 剪切板的内容删不掉 C语言学习:除去剪切板内容的换行与回车

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

2024-07-11 06:53| 来源: 网络整理| 查看: 265

前言

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

程序说明

作者为博主:余宁C

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

1.复制pdf内容

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

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

 

 

参考资料 让程序睡眠以降低CPU占用率:C语言的sleep、usleep、nanosleep等休眠函数的了解与用法_拥抱Linux的博客-CSDN博客_c usleep读取和写入剪切板内容:1.Windows 剪切板API详解 - 蓝雨麦郎 - 博客园 (cnblogs.com);2.(27条消息) C语言-剪切板使用_dandelionLYY的博客-CSDN博客_c语言获取剪切板 程序源码 #include #include /*提供malloc()等函数原型*/ #include /*提供剪切板相关函数原型*/ #include /*提供睡眠函数原型*/ /*将字符串写入到剪切板*/ 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; } 程序注意事项 文本内容需要添加结束符 '\0' , ASCLL码值为0;关于睡眠,作者原本使用 usleep(500);  用以让系统睡眠0.5s(文中代码是 sleep(1); 睡眠1s),可是作者发现程序运行时CPU使用率达到50%,而使用 sleep(1);  时CPU占用率只有10%不到; sleep(1);/*睡眠1s*/ 作者在源码使用分配内存的方式提供复制剪切板的缓存,而不是直接使用数组作为缓存,因为作者想玩,想绕远路罢了; char *content; content = malloc(20000);/*分配一片连续的内存*/ free(content);/*释放掉该指针指向的内存区域,与malloc对应使用*/ 注意剪切板有多种不同的格式,可以在头文件中看到,因此代码在分析剪切板的时候数据格式不对,相关函数就不会执行,相当于跳过,借此特性作为条件判断可以达到只对文本操作的目的,而对图片等其他格式没有影响

主程序:

//主程序: 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



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有