使用 GetText 从剪贴板获取文本 - 避免空剪贴板出错

Posted

技术标签:

【中文标题】使用 GetText 从剪贴板获取文本 - 避免空剪贴板出错【英文标题】:Get text from clipboard using GetText - avoid error on empty clipboard 【发布时间】:2012-01-26 17:13:12 【问题描述】:

我正在使用这样的代码从剪贴板中获取文本。

Dim DataObj As New MSForms.DataObject
DataObj.GetFromClipboard
myString = DataObj.GetText

我使用错误处理来解决剪贴板为空的情况,只要我将错误捕获设置为未处理错误时中断,一切都很好。

但是,出于不相关的原因,我想将错误捕获设置为在所有错误时中断,这会在找到空剪贴板时在DataObj.GetText 处引发错误。是否有任何类型的测试我可以在上游进一步应用以避免尝试处理空剪贴板?

【问题讨论】:

【参考方案1】:

使用On Error GoTo 处理错误,如下所示:

Sub GetClipBoardText()
   Dim DataObj As MSForms.DataObject
   Set DataObj = New MsForms.DataObject '<~~ Amended as per jp's suggestion

   On Error GoTo Whoa

   '~~> Get data from the clipboard.
   DataObj.GetFromClipboard

   '~~> Get clipboard contents
   myString = DataObj.GetText(1)
   MsgBox myString

   Exit Sub
Whoa:
   If Err <> 0 Then MsgBox "Data on clipboard is not text or is empty"
End Sub

你会注意到它也会处理一个空的剪贴板。

注意:要使代码正常工作,您必须 have a reference 到“Microsoft Forms 2.0 对象库”(此文件可以在 32 位机器上的 C:\windows\system32\FM20.dll 或 64 位机器上的 C:\Windows\sysWOW64\FM20.dll 找到),否则您会收到错误 "User-Defined type not defined"

您可以使用下面的代码在测试上面的代码之前清空剪贴板。请将其粘贴到模块中。

Private Declare Function OpenClipboard Lib "User32.dll" _
(ByVal hWndNewOwner As Long) As Long
  
Private Declare Function EmptyClipboard Lib "User32.dll" () As Long
 
Private Declare Function CloseClipboard Lib "User32.dll" () As Long
 
Public Sub ClearClipboard()
    Dim Ret
  
    Ret = OpenClipboard(0&)
    If Ret <> 0 Then Ret = EmptyClipboard
    CloseClipboard
End Sub

编辑:您还可以使用以下代码确定剪贴板是否为空:

Private Declare Function CountClipboardFormats Lib "user32" () As Long

Sub Sample()
    If (CountClipboardFormats() = 0) = True Then
        MsgBox "Clipboard is empty"
    Else
        MsgBox "Clipboard is not empty"
    End If
End Sub

【讨论】:

我会使用Dim DataObj As MSForms.DataObjectSet DataObj = MsForms.DataObject(单独的行)来避免自动实例化变量。此外,一个函数最适合抓取剪贴板文本并将其返回。 希望看到一个示例 :) 实际上建议您将整个代码发布在新帖子中。它不仅会帮助 OP,还会帮助其他任何寻求解决方案的人:) 没有。我不建议这样做;)原因是它可以帮助新人从中学习;)既然您提出了建议,为什么不在新帖子中跟进呢? 你已经有 99% 的代码,第二个几乎重复的答案是多余的。 您是否按照我的建议清除了剪贴板?如果是,那么您应该看到消息“剪贴板上的数据不是文本或为空”。我在发布之前测试了代码:)【参考方案2】:

添加以下代码只是 b4 用于调试的断线....该错误在测试后对我消失了..奇怪但它以某种方式工作(Excel 2010)

myString = DataObj.GetText(1)
MsgBox myString

【讨论】:

以上是关于使用 GetText 从剪贴板获取文本 - 避免空剪贴板出错的主要内容,如果未能解决你的问题,请参考以下文章

selenium中WebElement.getText()为空解决方法

无法从 HTML Dom 获取值/文本。我使用了 Selenium WebDriver 的 getAttribute() 和 getText()

swing复制文本框内容

如何在android中将文本复制到剪贴板[重复]

如何从剪贴板读取文本?

无法从文本字段Java获取文本