前言

我们在复制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

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

  1. C语言学习:剪切板UNICODE码使用

    前言 本文程序是基于作者另一篇文章的程序基础上做修改,链接:(17条消息) C语言学习:除去剪切板内容的换行与回车_余宁C的博客-CSDN博客 由于剪切板中普通的text数据是8位的,不能支持一些字符 ...

  2. PyQt5 技术篇-在clipboard.dataChanged.connect()里如何写入剪切板示例演示,pyqt5监听剪切板变动并写入剪切板内容

    PyQt5 自带的写入剪切板方法在 clipboard.dataChanged.connect() 里不生效,主要是为了避免死循环. 不过利用其它的写入剪切板方法放在里面就不会有影响了,比如 pype ...

  3. Web API 学习笔记 - 剪切板 Clipboard API

    F12打开调试窗口,Esc调出命令行.执行以下代码,给点赞按钮添加点击事件. function 粘贴剪切板内容(selector){navigator.clipboard.readText().the ...

  4. 计算机关闭系统剪切板上的内容,怎么清空剪切板内容?

    当您在使用电脑的"复制"以及"剪切"功能时,windows系统会把"复制"或"剪切"内容暂时存储在内存里,假如暂存的数据 ...

  5. Android 10 获取剪切板内容

    一般可以放在Activity的onResume中调用如下方法: //获取剪切板内容 private void getClipboardData() {this.getWindow().getDecor ...

  6. Win10清空剪切板内容的方法介绍

    剪切板是用户最经常使用的系统功能,可以对想要操作的内容进行临时缓存,但是长时间对里面的内容不清理的话,就会造成系统卡顿.下面小编就给大家介绍一下Win10清空剪切板内容的方法. 操作过程: 1.在Wi ...

  7. 【Windows使用技巧】清除剪切板内容

    问题描述: 当你的电脑借别人使用的时候, (脑洞:或者找大佬来帮你看问题的时候,或者你不在座位上 ----这时候有人过来有意无意ctrl+v了一下, 如果你之前刚好复制过什么密码,或者复制过什么令人面 ...

  8. 各系统剪切板内容获取

    最近在做UI自动化,出现点击按钮复制文案到剪切板的操作,由于执行机器有mac.win10.liunx,出现不同的兼容问题,简单记录一下 1.常用获取方式 Python xerox模块 import x ...

  9. python获取剪切板图片_python 获取剪切板内容的两种方法

    第一种 # -*- coding: utf-8 -*- # @Time : 2020/3/16 21:26 # @File : get_text_from_cupboard_13.py # @Auth ...

最新文章

  1. React.js绑定this的5种方法
  2. H5地理定位获取用户当前位置、城市
  3. HTML最常用的字符实体
  4. java代码示例(6-3)
  5. 14 篇论文为你呈现「迁移学习」研究全貌 | 论文集精选 #04
  6. AMD RX 8000系列将采用3纳米和5纳米工艺
  7. LeetCode:Add Two Numbers
  8. java8 ie_Java8语法糖之Lambda表达式_Hudie.的博客-CSDN博客
  9. python学习笔记(二)之列表
  10. 决策树(十二)--XGBoost
  11. Scipy教程 - 线性代数库scipy.linalg
  12. iOS:对GCD中 同步、异步、并行、串行的见解
  13. scrapy-redis的官方文档和源码位置
  14. mysql8.0.21官网安装步骤_MySQL8.0.21安装步骤及出现问题解决方案
  15. 从视频中截取图像opencv python
  16. 新媒体营销方式有哪几种
  17. MATLAB~~~描绘散点图函数scatter
  18. [深度学习]Part1 Python学习进阶Ch23爬虫Spider——【DeepBlue学习笔记】
  19. win10上部署elasticsearch8.1.1
  20. zip命令的坑 pyspark --py-files导入zip包不生效 / python导入zip包不生效

热门文章

  1. Jaccard 评价指标的简介与图示
  2. intel英特尔架构
  3. 7-3 小孩子才做选择,大人全都要 (10 分)
  4. 在c的基础上关于c#入门的一些个人理解
  5. android的UI性能优化
  6. 10047.GNU Make 使用手册中译版(转)
  7. MSDC 4.3 接口规范(26)
  8. autocomplete属性在谷歌浏览器不起作用
  9. C++输入和输出:控制台I/O(键盘和屏幕)及文件I/O详细笔记
  10. vc 调用webservice