如何在截图后清空剪贴板(Application.cutcopymode = False无效)?

4
我正在使用API调用进行屏幕截图。问题在于,该屏幕截图将保留在剪贴板上,而Application.CutCopyMode = False仅在从Excel直接复制内容时才起作用。
一个解决方法是在截图后只需在Excel中复制一些内容,然后使用Application.CutCopyMode,但如果有更正式的方法这将很有帮助。到目前为止,我尝试了以下方法,但它并没有起作用。
Sub clear()
    Dim db As MSForms.DataObject
    db.clear
End Sub

请参见https://dev59.com/s33aa4cB1Zd3GeqPdnc6。 - MatthewD
这就是我得到上面那段代码的地方,但它似乎没有起作用。 - apdm
抱歉,实际上使用SetText和PutInClipboard方法的解决方案的后半部分确实有效。谢谢。不过值得注意的是,由于某种原因,clear方法无法正常工作。 - apdm
顺便提一下,你可以使用以下代码而无需调用API来截屏:Application.SendKeys "(%{1068})" : DoEvents - ashleedawg
2个回答

3
创建一个名为“globals”的模块,并将它们放在其中。
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

然后从任何地方使用此代码。
OpenClipboard (0&)
EmptyClipboard
CloseClipboard

这很好用,正是我一直在寻找的,谢谢。 “0&”值是什么意思? 我有点理解参数用作剪贴板的句柄,但我不太熟悉“0&”。 - apdm
与打开剪贴板相关联的窗口句柄。如果此参数为NULL,则打开剪贴板将与当前任务相关联。请参见此处。https://msdn.microsoft.com/zh-cn/library/windows/desktop/ms649048(v=vs.85).aspx - MatthewD
HWND是Windows数据类型。请参见此处。https://msdn.microsoft.com/zh-cn/library/windows/desktop/aa383751(v=vs.85).aspx - MatthewD
我不确定我理解这部分内容:“如果此参数为NULL,则打开剪贴板将与当前任务关联。” 是否存在多个可能的剪贴板? - apdm
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - MatthewD

1
我认为是因为application.cutcopymode = false停止了复制和剪切模式,但没有清空剪贴板。
也许你可以像这样设置一个空字符串来清空剪贴板:
Dim emptyDataString as DataObject
Set emptyDataString = new DataObject 
emptyDataString.SetText ""
emptyDataString.PutInClipboard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接