📜  将文本发送到剪贴板 vb.net - VBA (1)

📅  最后修改于: 2023-12-03 15:09:37.793000             🧑  作者: Mango

将文本发送到剪贴板 - VB.NET/VBA

在VB.NET或VBA中,可以通过使用Clipboard对象将文本发送到剪贴板。

VB.NET中的Clipboard对象

在VB.NET中,可以使用Clipboard类从代码中访问系统剪贴板。这个类允许你将文本、图像以及其他格式的数据发送到剪贴板上。

下面是一段VB.NET代码,它将字符串“Hello, world!”发送到剪贴板:

Clipboard.SetText("Hello, world!")

如果你希望将剪贴板中的数据放入你的代码中,可以使用GetText方法:

Dim myText As String = Clipboard.GetText()

可以使用ContainsText方法来检查剪贴板上是否有文本:

If Clipboard.ContainsText() Then
    ' 剪贴板中存在文本
End If
VBA中的Clipboard对象

在VBA中,也可以使用Clipboard对象将数据放入剪贴板。需要注意的是,在VBA中,访问Clipboard对象需要使用Windows API函数。

下面是在VBA中使用Clipboard API将字符串发送到剪贴板的代码:

Declare PtrSafe Function OpenClipboard Lib "user32" (ByVal hwnd As LongPtr) As LongPtr
Declare PtrSafe Function EmptyClipboard Lib "user32" () As LongPtr
Declare PtrSafe Function CloseClipboard Lib "user32" () As LongPtr
Declare PtrSafe Function SetClipboardData Lib "user32" (ByVal wFormat As LongPtr, ByVal hMem As LongPtr) As LongPtr
Declare PtrSafe Function GlobalAlloc Lib "kernel32" (ByVal wFlags As LongPtr, ByVal dwBytes As LongPtr) As LongPtr
Declare PtrSafe Function GlobalLock Lib "kernel32" (ByVal hMem As LongPtr) As LongPtr
Declare PtrSafe Function GlobalUnlock Lib "kernel32" (ByVal hMem As LongPtr) As LongPtr
Declare PtrSafe Function lstrcpy Lib "kernel32" Alias "lstrcpyW" (ByVal lpString1 As Any, ByVal lpString2 As Any) As LongPtr

Public Function SetClipboardText(ByVal text As String) As Boolean
    Dim buffer() As Byte
    buffer = StrConv(text, vbUnicode)

    Dim hGlobalMemory As LongPtr
    hGlobalMemory = GlobalAlloc(&HGMEM_MOVEABLE, UBound(buffer) + 2)

    If hGlobalMemory = 0 Then Exit Function

    Dim lpMemory As LongPtr
    lpMemory = GlobalLock(hGlobalMemory)

    If lpMemory = 0 Then
        Call GlobalUnlock(hGlobalMemory)
        Call GlobalFree(hGlobalMemory)
        Exit Function
    End If

    Call lstrcpy ByVal lpMemory, buffer

    Call GlobalUnlock(hGlobalMemory)

    Call OpenClipboard(0&)
    Call EmptyClipboard()
    Call SetClipboardData(CF_UNICODETEXT, hGlobalMemory)
    Call CloseClipboard()

    SetClipboardText = True
End Function

你可以调用这个函数,向剪贴板中发送字符串:

SetClipboardText "Hello, world!"

类似地,可以使用GetClipboardData函数从剪贴板中获取文本:

Declare PtrSafe Function GetClipboardData Lib "user32" (ByVal wFormat As LongPtr) As LongPtr

Public Function GetClipboardText() As String
    Dim hData As LongPtr
    Dim lpData As LongPtr

    Call OpenClipboard(0&)
    hData = GetClipboardData(CF_UNICODETEXT)
    lpData = GlobalLock(hData)
    GetClipboardText = StrConv(lpData, vbUnicode)
    Call GlobalUnlock(hData)
    Call CloseClipboard
End Function

使用方式如下:

Dim myText As String
myText = GetClipboardText()
注意事项
  • 在将文本发送到剪贴板之前,确保你已经清除了剪贴板上的任何数据。这可以通过调用EmptyClipboard方法来实现。
  • 在使用Windows API函数之前,你需要声明函数及其参数。声明的最后一个部分表示函数的别名,确保在调用API函数时使用相应的名称。
  • 对于未能正常使用API的VBA代码(例如在64位版本的Office中),需要使用“PtrSafe”关键字来声明Long类型的指针。
  • 所有的字符串都必须转换为Unicode编码(UTF-16)格式。