在 Office 365 中清除剪贴板

Posted

技术标签:

【中文标题】在 Office 365 中清除剪贴板【英文标题】:Clearing the clipboard in Office 365 【发布时间】:2020-09-25 14:38:36 【问题描述】:

我在 Windows 10 64 位下使用 Office 365。我正在尝试清除剪贴板。宏记录器产生一个空子。

以下尝试大多收集自How to Clear Office Clipboard with VBA:

Option Explicit
Public Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long
Public Declare Function EmptyClipboard Lib "user32" () As Long
Public Declare Function CloseClipboard Lib "user32" () As Long

Public Sub ClearClipboardA()
    Application.CutCopyMode = False
End Sub

Public Sub ClearClipBoardB()
    ' Source: http://www.vbaexpress.com/kb/getarticle.php?kb_id=462
    Dim oData As New DataObject
    oData.SetText Text:=Empty ' Clear
    oData.PutInClipboard ' Putting empty text into the clipboard to empty it
End Sub

Public Sub ClearClipboardC()
    OpenClipboard (0&)
    EmptyClipboard
    CloseClipboard
End Sub

版本 A:

找不到方法或数据成员

版本 B:在不清除剪贴板的情况下运行。很快就会出现一个黄色的小状态窗口:

“7 of 24 - 剪贴板 | 未提取元素”

(翻译成英文)

版本 C:似乎什么都没有发生。

在上述参考资料中,用户 iamstrained 写道:“...如果有人正在寻找如何在 64 位下的 Office 365 中执行此操作,您现在需要使用修改以实现向后兼容性:Private Declare PtrSafeLongPtr,因为您对这些值的两次更改将解决问题并使其仍然有效。”

我找到了对 Microsoft 页面的引用,这可能已经完成:

https://docs.microsoft.com/da-dk/office/vba/access/Concepts/Windows-API/send-information-to-the-clipboard

使用此处显示的 subs,我可以将文本插入剪贴板并从中提取,但不能清除它。

【问题讨论】:

这能回答你的问题吗? How to Clear Office Clipboard with VBA Here 是使用 Windows Script Host 的单行程序,您可以将其添加到集合中。还是不行? 【参考方案1】:

清除办公室剪贴板(从 Excel):

#If VBA7 Then
    Private Declare PtrSafe Function AccessibleChildren Lib "oleacc" (ByVal paccContainer As Office.IAccessible, _
    ByVal iChildStart As Long, ByVal cChildren As Long, _
    ByRef rgvarChildren As Any, ByRef pcObtained As Long) As Long
    Public Const myVBA7 As Long = 1
#Else
    Private Declare Function AccessibleChildren Lib "oleacc" (ByVal paccContainer As Office.IAccessible, _
                                                              ByVal iChildStart As Long, ByVal cChildren As Long, _
                                                              ByRef rgvarChildren As Any, ByRef pcObtained As Long) As Long
    Public Const myVBA7 As Long = 0
#End If

Public Sub EvRClearOfficeClipBoard()
    Dim cmnB, IsVis As Boolean, j As Long, Arr As Variant
    Arr = Array(4, 7, 2, 0)                      '4 and 2 for 32 bit, 7 and 0 for 64 bit
    Set cmnB = Application.CommandBars("Office Clipboard")
    IsVis = cmnB.Visible
    If Not IsVis Then
        cmnB.Visible = True
        DoEvents
    End If

    For j = 1 To Arr(0 + myVBA7)
        AccessibleChildren cmnB, Choose(j, 0, 3, 0, 3, 0, 3, 1), 1, cmnB, 1
    Next
        
    cmnB.accDoDefaultAction CLng(Arr(2 + myVBA7))

    Application.CommandBars("Office Clipboard").Visible = IsVis

End Sub

【讨论】:

非常感谢!我已经在 Excel 和 Word 中测试了你的宏,它确实清除了剪贴板!我对 for 循环中添加的“0 + myVBA7”感到困惑。选择功能我不知道,它似乎很有用。 对于您需要的win32版本:0,3,0,3(所以4个步骤)并执行默认操作2&(1&对于PasteAll)对于您需要的win64版本:0,3,0,3 ,0,3,1(所以 7 个步骤)并执行默认操作 0&(对于 PasteAll 0,3,0,3,0,3,0)这是编写此 Sub 的最短方法,适用于两个版本跨度> 这是唯一对我有用的版本。谢谢!【参考方案2】:

我可以确认下面的代码清除了 Windows 剪贴板

#If Win64 Then
Declare PtrSafe Function OpenClipboard Lib "user32" (ByVal hwnd As LongPtr) As Long
Declare PtrSafe Function CloseClipboard Lib "user32" () As Long
Declare PtrSafe Function EmptyClipboard Lib "user32" () As Long
#Else
Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long
Declare Function CloseClipboard Lib "user32" () As Long
Declare Function EmptyClipboard Lib "user32" () As Long
#End If

Public Sub ClearClipboard()
   OpenClipboard (0&)
   EmptyClipboard
   CloseClipboard
End Sub

您可以从https://www.microsoft.com/en-us/download/confirmation.aspx?id=9970下载指针安全声明

【讨论】:

感谢您的回复。我从您提供的链接下载了 Office2010Win32API_PtrSafe.exe,以管理员身份执行,将您提供的代码复制到新模块并运行它。不幸的是,它对剪贴板的内容没有影响。 @HolgerNielsen - 你确定你的剪贴板里有东西吗?我从您的问题中复制了一段文本,并将其粘贴到一个新的文本文档中,然后运行该代码。剪贴板是空的。我在 Win 10 x64 上使用 O365。 是的,我打开了 Word 的剪贴板,所以我可以查看是否添加或删除了某些内容。我已经在我的 C: 驱动器中搜索“user32”,那里有几个 user32.dll,但没有一个带有最近时间戳的,如果这很重要的话。无论如何我可以检查 PtrSave 元素的安装是否已经完成?我应该尝试再次运行安装 .exe 文件吗?感谢您的支持发言! @HolgerNielsen - Office2010Win32API_PtrSafe.exe 仅包含文档,以便您可以查看声明应该是什么。所以没有“安装 PtrSave 元素”。 Win32API 是 Windows 的一部分。要使用它,您只需在代码中包含正确的声明即可。 感谢您解决此问题。就我而言,可悲的是,剪贴板没有任何反应。【参考方案3】:

我已经使用了上面的代码 sn-p 并且它运行良好,直到最近的软件更新阻止我在不打开剪贴板窗口的情况下清除办公室剪贴板。我的解决方案非常简单 - 只需将其添加到代码中:

#If VBA7 Then
    Private Declare PtrSafe Function AccessibleChildren Lib "oleacc" (ByVal paccContainer As Office.IAccessible, _
    ByVal iChildStart As Long, ByVal cChildren As Long, _
    ByRef rgvarChildren As Any, ByRef pcObtained As Long) As Long
    Public Const myVBA7 As Long = 1
#Else
    Private Declare Function AccessibleChildren Lib "oleacc" (ByVal paccContainer As Office.IAccessible, _
                                                              ByVal iChildStart As Long, ByVal cChildren As Long, _
                                                              ByRef rgvarChildren As Any, ByRef pcObtained As Long) As Long
    Public Const myVBA7 As Long = 0
#End If

Public Sub EvRClearOfficeClipBoard()
    Dim cmnB, IsVis As Boolean, j As Long, Arr As Variant
    Arr = Array(4, 7, 2, 0)                      '4 and 2 for 32 bit, 7 and 0 for 64 bit
    Set cmnB = Application.CommandBars("Office Clipboard")
   
'Just add here...First
'---------------------    
    With Application
       .DisplayClipboardWindow = True
    End With

    IsVis = cmnB.Visible 

    If Not IsVis Then
        cmnB.Visible = True
        DoEvents
    End If

    For j = 1 To Arr(0 + myVBA7)
        AccessibleChildren cmnB, Choose(j, 0, 3, 0, 3, 0, 3, 1), 1, cmnB, 1
    Next
        
    cmnB.accDoDefaultAction CLng(Arr(2 + myVBA7))

    Application.CommandBars("Office Clipboard").Visible = IsVis

'And finish with this
'--------------------
    With Application
       .DisplayClipboardWindow = False
    End With

End Sub

【讨论】:

查看我的编辑 - 请注意格式化 How do I format my posts using Markdown or html 的约定。【参考方案4】:

EvR 清除Office Clipboard 的宏非常聪明。 (请参阅above。)它可以在 Excel 中与我的 64 位 Microsoft (Office) 365 和 Windows 10 一起使用。

VBA7 是随 Office 2010 引入的;现在每个人都应该拥有它。 vba7 指令不区分 64 位;如果需要,win64 指令会执行此操作。所以这是我的 EvR 宏版本:

Declare PtrSafe Function AccessibleChildren Lib "oleacc" ( _
    ByVal paccContainer As Office.IAccessible, _
    ByVal iChildStart As Long, ByVal cChildren As Long, _
    ByRef rgvarChildren As Any, ByRef pcObtained As Long) As Long
Sub ClearOfficeClipboard()
    Dim A() As Variant, CB As Variant, n As Variant, i As Integer
    With Application
        If Not .DisplayClipboardWindow Then
            ClearClipboard
            .DisplayClipboardWindow = True
            ClearOfficeClipboard ' recurse
            Exit Sub
        End If
        On Error GoTo ErrHandler
        Set CB = .CommandBars("Office Clipboard")
        A = Array(0, 3, 0, 3, 0, 3, 1)
        For i = 0 To UBound(A)
            AccessibleChildren CB, A(i), 1, CB, n
        Next i
        CB.accDoDefaultAction CLng(0)
    End With
ErrHandler:: Set CB = Nothing
End Sub

ClearClipboard 宏来自 Chip Pearson,http://www.cpearson.com/Excel/Clipboard.aspx。 (参见 Timothy Rylatt above,但用 vba7 代替 win64。)

我不明白调用 AccessibleChildren 的 For 循环。有人可以解释它是如何工作的吗?请注意,CB 必须是 Variant,而不是 CommandBar 或 Object。

【讨论】:

以上是关于在 Office 365 中清除剪贴板的主要内容,如果未能解决你的问题,请参考以下文章

在 Excel(VSTO 代码)中使用剪贴板复制粘贴会冻结其他 Microsoft Office 应用程序

以编程方式访问 Office 剪贴板的元素

如何在 PyQt 应用程序退出时禁用清除剪贴板?

清除办公剪贴板,使复制的数据不与其他办公程序共享

清除剪贴板以禁止未经授权的复制,插入消息?

excel中清除剪切板内容的快捷键