很久之前就发现有这么个问题,用UltraEdit编辑器(以下简称UE)复制或剪切文本后,有时无法直接粘贴到我用Delphi7写的程序里,但如果先粘贴到记事本再从记事本复制粘贴是可以的,特别是在通过远程桌面粘贴时这个问题更是严重,出现几率很高。时间长了,终于发现一个规律,就是编辑UTF8或UNICODE编码的有中文的文件时特别容易出现,普通ANSI编码或纯英文的内容粘贴倒是OK的。但具体为何会这样却不太清楚,总不能说我们的程序连记事本粘贴这种基本要求都达不到吧,今天有空便决定分析一下其中的原因。

首先打开Delphi建立一个测试工程,放了个按钮,在点击时将剪贴板的文本取出来显示:

procedure TForm1.Button1Click(Sender: TObject);
beginif Clipboard.HasFormat(CF_TEXT) thenShowMessage(Clipboard.AsText);
end;

然后用UE打开一个UTF8编码含中文的HTML文件,复制一段内容如下:

<tr><td>标题</td><td><input class="input" type="text" name="P_标题" id="P_标题" value=""/></td>
</tr>

然后点击程序的测试按钮,结果显示的是一个空的消息框:

也就是说,程序能检测到剪贴板里有文本,但取文本格式的数据却取不到,导致粘贴失败。问题可能出在UE往剪贴板里放的数据格式不对。本身来说,UTF8的格式并不会完全无法取读,顶多是中文变乱码,但英文应该能读出来的,因此剪贴板里肯定不是UTF8格式数据。考虑到UE经常把UTF8格式的文件当UNICODE处理,于是我尝试以UNICODE方式提取数据:

procedure TForm1.Button1Click(Sender: TObject);
varData: THandle;
beginif Clipboard.HasFormat(CF_TEXT) thenbeginClipboard.Open;Data := GetClipboardData(CF_TEXT);tryShowMessage(PWideChar(GlobalLock(Data)));finallyGlobalUnlock(Data);Clipboard.Close;end;end;
end;

但结果出来的是一堆乱码,说明里面存放的也不是UNICODE。
问题似乎找不着原因了,但我很快跟踪发现,剪贴板是CF_TEXT数据只是第一个字节是0,中间的数据是对的,中文也转成GBK编码了,高兴了一会,以为把指针移一下就能解决了,但很快又发现最后的数据缺了几个字节。究其原因,可能是因为有中文,导致编码转换时长度被截短了。

于是决定要分析下剪贴板内容。以前写过一个剪贴板内容分析的程序,但年代久远,找了很久没找着,反正原理也不复杂,于是又重新写了一个。运行起来一分析,终于发现原因,原来这种情况下UE放到剪贴板里的数据有好几种,不知为何其中放CF_TEXT格式的内容是错误的,它第一个字节被替换成0了,结尾处又丢了几个字节的数据:

但它放的CF_UNICODETEXT格式是正确的,一个字都不少,也没有增加0:

因此我只要修改下代码,判断无法取到CF_TEXT,而同时又有CF_UNICODETEXT的情况下,直接去取CF_UNICODETEXT:

procedure TForm1.Button1Click(Sender: TObject);
varData: THandle;p: Pointer;ws: WideString;
beginif Clipboard.AsText <> '' thenMemoTxt.SelText := Clipboard.AsTextelse if Clipboard.HasFormat(CF_UNICODETEXT) thenbeginClipboard.Open;Data := GetClipboardData(CF_UNICODETEXT);tryif Data <> 0 thenbeginp := GlobalLock(Data);ws := PWideChar(p);MemoTxt.SelText := ws;end;finallyif Data <> 0 then GlobalUnlock(Data);Clipboard.Close;end;end;
end;

至此问题基本解决,记事本能粘贴则我的程序也能。

小结:由于Delphi7的VCL本身不支持Unicode,因此在粘贴UE的UTF8或UNICODE格式数据时会出现问题;虽然不清楚UE为何会放错的数据到剪贴板,但直接取UNICODE内容能解决问题,达到我们想要的结果。

UltraEdit剪贴板内容有时无法直接粘贴的原因相关推荐

  1. 键盘快捷键将剪贴板内容粘贴到命令提示符窗口(Win XP)[关闭]

    本文翻译自:Keyboard shortcut to paste clipboard content into command prompt window (Win XP) [closed] Is t ...

  2. 如何使用ue编辑java,UltraEdit文字编辑器教程:UltraEdit / UEStudio脚本访问剪贴板内容...

    UltraEdit是一款功能强大基于磁盘的文本编辑器.程序员的编辑器和十六进制编辑器.可以用于编辑HTML.PHP.javascript.Perl.C/C++.Python以及其他任何的编码/编程语言 ...

  3. UltraEdit / UEStudio脚本访问剪贴板内容

    UltraEdit是一款功能强大基于磁盘的文本编辑器.程序员的编辑器和十六进制编辑器.可以用于编辑HTML.PHP.javascript.Perl.C/C++.Python以及其他任何的编码/编程语言 ...

  4. Ditto剪贴板增强工具 ,方便复制粘贴多条历史记录

    转载自<https://www.iplaysoft.com/ditto.html>   尽管 Windows 一直不断在升级,但系统自带的剪贴板功能却仍然弱爆了,它只能保留一条记录,没有剪 ...

  5. delphi 复制到剪贴板_Delphi中的基本剪贴板操作(剪切/复制/粘贴)

    delphi 复制到剪贴板 The Windows Clipboard represents the container for any text or graphics that are cut, ...

  6. javaFX学习之剪贴板Clipboard类型对象及剪贴板内容ClipboardContent对象 和 ContextMenu内嵌式上下文菜单的使用

    添加上下文菜单ContextMenu 当你无法分配任何UI空间给一个需要的功能时,你可以使用上下文菜单ContextMenu.上下文菜单ContextMenu是一个弹出窗口,会由一次鼠标点击事件触发显 ...

  7. Win32 API 获取其他程序剪贴板内容

    代码如下:使用CFree: #include <windows.h>int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInst ...

  8. 淘宝吱口令效果实现,获取系统剪贴板内容

    首先把消息赋值到系统的剪贴板,然后再从系统剪贴板中获取到赋值的信息 第一步,复制信息,代码如下: //获取剪贴板管理器: ClipboardManager cm = (ClipboardManager ...

  9. 【Windows 批处理】获取剪贴板内容并打开浏览器翻译

    Windows 批处理获取剪贴板内容并打开浏览器翻译 Windows 批处理获取剪贴板内容并打开浏览器翻译 使用批处理程序(.bat文件)用浏览器打开固定的页面 判断中英文 英文空格拼接 使用剪贴板 ...

最新文章

  1. 机器视觉-相机内参数和外参数
  2. c# Sockect 通信
  3. Dotfuscator使用教程
  4. 私有GIT服务器的免密提交
  5. Java基础学习总结(77)——Java枚举再总结
  6. python request属性及方法说明
  7. 前方预警!Windows Server 将默认需符合 TPM2.0,服务器商需在来年 1 月 1 日前适配相应规则...
  8. Js实现滚动抽奖(作弊版)
  9. 记一次PSP游戏文件(iso)提取BGM(cpk文件处理,无后缀音频文件格式转换,pmf文件转换)
  10. 下载win7原版ios系统文件
  11. 诊所 金卫系统 青岛_金卫信预防接种数字化门诊全程质量管理系统.doc
  12. 【图像分割】基于直觉模糊C均值聚类实现图像分割IFCMmatlab代码
  13. 超级表格从四个维度为您实现精细化的表格数据共享【点击查看】
  14. ps cc2019版为什么做图一复制图层就卡死_你所不知道的十个被藏起来的PS功能,超级实用!...
  15. U大师U盘启动盘克隆制作工具
  16. 解决office2003 32位卸载不干净 无法安装office2013 64位在问题
  17. OpenCV学习~moviepy视频裁剪
  18. WebLogicServer BEA-000386 Weblogic启动报错
  19. 医学影像学考试 计算机,规培影像学的考试.ppt
  20. 常见Java面试+答案

热门文章

  1. Feign 获取异常
  2. 【数据库篇】Redis知识点
  3. 高雄/選舉奧步一定告 陳菊律師團強硬
  4. java inflater_inflater.inflate()的参数含义
  5. redis惰性删除 lazy free 源码剖析,干货满满
  6. MongoDB 数据操作(二)数据查询(10)正则运算
  7. 安卓全面屏手机获取虚拟导航栏高度
  8. 文因互联鲍捷:深度解析知识图谱发展关键阶段及技术脉络 | 干货推荐
  9. P4383 [八省联考2018]林克卡特树(树形dp+wqs二分)
  10. 运动耳机和无线耳机哪个好、运动最好用的耳机推荐