VBA Microsoft 网站上的代码示例破坏了计算机其余部分的剪贴板。为什么会发生这种情况,我该如何预防?

VBA code example on Microsoft's website destroyed the clipboard for the rest of the computer. Why did this happen and how can I prevent it?

这是我什至认为不可能的事情,但可以了。我试图学习如何在 Visual Basic 中使用 Windows API 来使用系统调用,以及 this tutorial (是的,我不得不手动输入 link 来询问这个问题,稍后会详细介绍)向我展示了如何使用剪贴板检索用户使用 Ctrl+C 复制的文本。出于好奇,并假设所有用户输入都是错误的输入,我尝试按 Print Screen 然后 运行 代码只是为了看看会发生什么。我收到了一些错误消息(不记得是什么),但很奇怪的是,现在剪贴板不再起作用了!无论我使用什么程序,我在剪切或复制后所做的任何尝试粘贴,要么什么都不做,要么在我使用它的程序中出现 returns 错误消息。是的,这是我故意的错试图破坏代码示例,但说实话 - OS 没有任何借口这么容易崩溃。如果重要的话,我正在使用 PC 运行 Windows 10.

编辑:设置不允许我清除剪贴板,当我尝试查看剪贴板历史记录时,它显示什么也没有。不幸的是,我无法截取剪贴板历史记录,因为当我尝试打开截图工具时它会自行关闭。

听起来您错过了一个 CloseClipboard(),保持剪贴板锁定,因为 Windows 认为程序正在读取或写入它。这将阻止其他程序使用剪贴板,因为一次只有一个程序可以访问它。如果 Access 仍然打开,您可以立即 window 运行 CloseClipboard 尝试,否则,我建议重新启动。

在这样的代码中,始终添加调用 CloseClipboard() 的错误处理程序,以防止在发生意外情况时让剪贴板保持打开状态。请注意,在使用 WinAPI 时,您可能会遇到可能无法调用错误处理程序的硬崩溃,因此请始终 triple-check 您的指针并期待崩溃和重新启动。

您找到的代码也未针对 64 位使用进行调整,因此请注意。如果您只是通过在函数上敲打 PtrSafe 使其工作,您可能会得到无效的指针,这可能会导致 Access 崩溃,使剪贴板保持打开状态且无法使用。

您找到的代码虽然是由 Microsoft 编写的,但质量不是特别好。我建议首先使用 EnumClipboardFormats 检查剪贴板上是否有文本,然后仅在剪贴板上确实有文本时才请求文本。

请注意,通过 VBA 使用 WinAPI 很困难,这不是初学者的东西,尤其是在剪贴板方面。

请注意,没有任何借口让 OS 如此容易崩溃 这不是使用 WinAPI 时应有的态度。您直接与 OS 交互,没有任何托管语言提供的安全性,并且手动使用指针。如果你做了一些无效的事情,它可能会崩溃。大多数人使用将危险的东西抽象出来的库是有原因的,如果你不这样做,所有的赌注都会被取消。