如何安全、正确地创建 Windows 剪贴板的备份?

2024-04-04

我正在尝试创建 Windows 剪贴板的备份。基本上我正在做的是使用EnumClipboardFormats()获取当前剪贴板上存在的所有格式,然后对于每种格式,我调用GetClipboardData(format).

备份数据的一部分显然涉及复制数据。我通过调用来做到这一点GlobalLock()(其中“锁定全局内存对象并返回指向该对象内存块的第一个字节的指针。”GetClipboardData(),然后我通过调用获取数据的大小GlobalSize(),最后我做了一个memcpy()复制数据。然后我当然打电话GlobalUnlock()当我完成时。

嗯,这在大多数情况下都有效。我的程序崩溃于GlobalLock()如果剪贴板包含以下格式的数据CF_位图 or CF_元文件图片。阅读这篇旧新事物博客文章后(https://devblogs.microsoft.com/oldnewthing/20071026-00/?p=24683 https://devblogs.microsoft.com/oldnewthing/20071026-00/?p=24683)我发现了崩溃发生的原因:显然并非剪贴板上的所有数据都是使用分配的GlobalAlloc()(例如CF_位图数据),所以调用GlobalLock()该数据会导致崩溃。

我碰到这篇 MSDN 文章 https://learn.microsoft.com/en-us/windows/win32/dataxchg/clipboard-operations它给出了剪贴板格式的列表以及系统如何释放它们。所以我所做的是将所有剪贴板格式硬编码到我的程序中(CF_*)未被释放的GlobalFree()系统功能,我根本不备份这些格式;我跳过它们。

事实上,这个解决方法看起来效果很好。即使剪贴板上有位图或“特殊”数据(例如从 Excel 复制到剪贴板的行),我的剪贴板备份功能也运行良好,并且没有遇到任何崩溃。另外,即使剪贴板上有位图并且我在备份期间跳过某些格式(例如CF_位图),在恢复剪贴板备份后,我仍然可以 Ctrl+V 从剪贴板粘贴最初复制的位图,因为位图也以剪贴板上的其他格式表示,这不会导致我的程序崩溃(CF_DIB).

然而,这充其量只是一种解决方法。我担心的是,其中一次会出现某种奇怪的格式(可能是私人格式,即介于CF_PRIVATEFIRST and CF_PRIVATELAST,或者可能是其他类型)将在剪贴板和我的程序上,调用后GlobalLock(),又会崩溃。但由于似乎没有太多文档解释备份剪贴板的最佳方法,而且很明显GlobalLock() does not对于所有数据类型都可以正常工作(不幸的是),我不确定如何处理这些情况。是否可以安全地假设所有其他格式(除了前面 URL 中列出的未由GlobalFree()-- 可以使用“抓取”GlobalLock()?

有任何想法吗?


这是愚蠢的,因为您无法 100% 备份/恢复剪贴板。许多应用程序使用延迟渲染,并且数据实际上并不在剪贴板上。当您请求粘贴时,他们会收到通知并生成数据。对于来自 Excel 等应用程序的大量数据,这将需要几分钟和数百 MB 的时间。从 Excel 复制时,查看剪贴板上列出的格式数量。会有两打以上,包括Bitmap、Metafile、HTML。如果您在 Excel 中选择 255x25000 单元格并复制它,您认为会发生什么?该位图有多大?提示:在尝试此操作之前,请保存所有打开的文档,因为您可能需要重新启动。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何安全、正确地创建 Windows 剪贴板的备份? 的相关文章

  • 移动/调整窗口大小时闪烁

    我开发了一个显示 jpeg 图像的应用程序 它可以显示 4 个图像 屏幕的每个象限各一个 为此 它使用了 4 个窗口 窗口没有边框 框架 也没有标题栏 当加载新图像时 窗口大小会根据新图像进行调整 然后显示该图像 尤其是当窗户做得较大时 经
  • 从命令行运行 R 代码 (Windows)

    我在名为 analysis r 的文件中有一些 R 代码 我希望能够从命令行 CMD 运行该文件中的代码 而无需通过 R 终端 并且我还希望能够传递参数并在我的代码中使用这些参数 例如就像下面的伪代码 C gt execute r scri
  • 取消后调用 boost::asio 异步处理程序没有错误

    我的代码在单个线程中使用 boost asio 和 io service 来执行各种套接字操作 所有操作都是异步的 每个处理程序都依赖于boost system error code 特别boost asio error operation
  • Kerberos 双跳

    我们遇到了臭名昭著的 Kerberos 双跳问题 这是一个全新的域 是从以前使用模拟和委派的另一个提供商迁移而来的 我们已将操作系统升级到最新的 SQL 服务器 2017 WPF 应用程序 使用域凭据 gt Web 服务 IIS 10 上的
  • 访问图像的 Windows“标签”元数据字段

    我正在尝试进行一些图像处理 所以现在我正在尝试读取图像 exif 数据 有 2 个内置函数可用于读取图像的 exif 数据 问题是我想读取图像标签 exifread and imfinfo这两个函数都不显示图像标签 Is there any
  • 本地推送通知到在应用程序内运行 JS 代码的 Win8 Live Tile

    我正在尝试将更新发送到我的应用程序的磁贴 当应用程序运行时 这可以正常工作 例如 当用户单击按钮时 我可以轻松地将磁贴更新通知发送到磁贴 我无法解决的是当应用程序无法运行时如何更新磁贴 我找到的唯一选择是使用以下命令从远程 Web 服务器拉
  • Vim 在 Mingw 上表现异常

    我在 MinGW 4 6 2 上的 Vim 表现得很奇怪 例如 在插入模式下按 Backspace 会删除字符 但我必须用箭头键移动光标才能删除的字符消失 而且它也会使我退出插入模式 另一个例子 按 Del 删除字符有时会生成奇怪的字符 例
  • 自定义波特率,redux

    我遇到的问题详述如下自定义波特率 https stackoverflow com questions 7714060 custom baud rate SetCommState 波特率 921600 失败 但波特率 115200 成功 尽管
  • 通过插件管理器在 Notepad++ 中配置代理设置

    我想在 Notepad 中配置代理设置 以允许通过代理从互联网下载 在从网上搜索如何执行此操作后 我了解到我需要通过 设置 按钮在插件管理器中执行此操作 当我转到插件 gt 插件管理器 gt 显示插件管理器 gt 设置时 我看到下面的对话框
  • 如何在 C# 中将字符串的内容复制到剪贴板? [复制]

    这个问题在这里已经有答案了 如果字符串中有一些文本 如何将其复制到剪贴板 以便用户可以将其粘贴到另一个窗口 例如 从我的应用程序粘贴到记事本 您可以使用System Windows Forms Clipboard SetText
  • 尽管 if 语句,Visual Studio 仍尝试包含 Linux 标头

    我正在尝试创建一个强大的头文件 无需更改即可在 Windows 和 Linux 上进行编译 为此 我的包含内容中有一个 if 语句 如下所示 if defined WINDOWS include
  • 用于创建计划任务的 VBScript

    我正在尝试创建一个 VBScript 它创建一个批处理文件 然后创建一个计划任务来运行该批处理文件 到目前为止 我尝试过的所有操作都创建了批处理文件 但没有创建计划任务 并且我没有收到任何错误 这是我到目前为止所拥有的 Option Exp
  • 将所有文件与指定目录(和子目录)中的所有文件进行二进制比较

    我需要将目录及其子目录中包含的所有文件与同一目录及其子目录中包含的所有其他文件进行比较 并将匹配文件的路径记录到文本文件或 CSV 我意识到有一些软件工具可以做到这一点 但除非它可以在 Windows 中开箱即用 否则我将不被允许在我的网络
  • 获取自动热键中的可用屏幕区域

    我正在尝试编写一些简单的 AutoHotkey 脚本来移动窗口 但在获取正确的屏幕尺寸值时遇到问题 我试图获取屏幕上可用区域的大小 通常是全屏分辨率减去任务栏 也许还有任何其他停靠窗口 如 Vista 中的侧边栏 我发现的获取屏幕宽度的方法
  • 生成尽可能最快的可执行文件

    我有一个非常大的程序 我一直在 Visual Studio 下编译 v6 然后迁移到 2008 我需要可执行文件尽可能快地运行 该程序大部分时间都花在处理各种大小的整数上 并且执行很少的 IO 显然 我会选择最大优化 但似乎可以做很多不属于
  • SetWindowsHookEx 函数返回 NULL

    我正在研究 DLL 注入 但收到错误如下 挂接进程失败 87 参数不正确 目标进程和dll都是64位的 注入代码为 BOOL HookInjection TCHAR target TCHAR dll name https msdn micr
  • 如何处理来自单独线程的窗口消息?

    我希望启动一个单独的线程来处理窗口消息 通过阻塞 GetMessage 循环 但之后仍然在初始线程中创建窗口 在单独的线程中 一旦启动 我就会调用PeekMessage使用 PM NOREMOVE 确保消息队列存在 有必要吗 然后 Atta
  • 如何使用正则表达式验证带有可选百分比符号的小数?

    正如问题的标题 我需要使用以下值验证正则表达式 最多 2 个小数位和 9 个整数 带有可选的百分比符号 Valid 10 0 1111111 12 15 2 10 2 3 Invalid 12 02 123456789123 123 I t
  • 在 Vista 上调用 RPC 时出现“不支持操作”

    我的应用程序使用 Microsoft RPC 进行进程间通信 当两个进程在同一台机器上运行并且一个进程尝试调用声明为 IDL 表示法 的方法时 error status t rpcMethod in pipe byte parameter
  • 如果我使用客户端计算机上未安装的字体,会发生什么情况?

    有人可以告诉我 如果我在 WinForms 应用程序中使用目标计算机上不可用的字体 会发生什么情况 它是否使用同一系列的字体 只是 Sans Serif 还是其他字体 您的应用程序将回退到 Segoe UI Tahoma 然后是 MS Sa

随机推荐