z761003 发表于 2022-3-20 17:15:23

剪贴板数据读出又原样写入[已解决]

本帖最后由 z761003 于 2022-3-21 05:26 编辑

想把当前剪贴板中的内容(可能是文本,也可能是复制了个文件或一位图)读出后暂时放个变量里面,再写入段文本后使用完,想重新把刚读出的内容原封不动写回去,
怎么整?试了下如果原内容为文本的话比较容易
$a=ClipGet()
Clipput("abc")
;使用完后Clipput($a)
可如果原来剪贴板中复制的是图片或文件,研究半天Clipboard.au3楞是没看明白怎么整{:1_618:}

afan 发表于 2022-3-20 18:29:07

提供思路供参考
1,_ClipBoard_EnumFormats 枚举当前剪贴板内包含的数据格式
2,_ClipBoard_GetData 备份需要的格式所对应的数据(文本或二进制的文件列表、位图数据或其它)
3,你自己的 Clip* 操作
4,_ClipBoard_SetData 将备份的数据放回去

z761003 发表于 2022-3-20 23:13:41

还是一头雾水,:face (9):
比如,我就对准文件夹里某个文件右键点了复制,枚举出来如下
我现在如何用_ClipBoard_GetData 保存,又如何重写进去?
另外,_ClipBoard_GetData 介绍里的格式又是这样的

这两图也不是一一对应的呀

z761003 发表于 2022-3-21 05:25:44

本帖最后由 z761003 于 2022-3-21 05:26 编辑

推敲了按下面的整成功了,常用的能应付了,感觉一个简单的复制粘贴被Windows设计得好鸡肋,为什么不简单些另外好像枚举时有个 HTML格式的,没看到文档里有对应的格式,不管这么多了

Func _ClipBoard_Backup()
   If Not _ClipBoard_Open(0) Then SetError(-1)
   Local $iFormat,$lsData
    ; 枚举剪贴板格式
    Do
      $iFormat = _ClipBoard_EnumFormats ($iFormat)
      If $iFormat <> 0 Then

            Switch _ClipBoard_FormatStr ($iFormat)
                        Case "OEM Text"
                           Assign("_ClipBoard_OEMText",_ClipBoard_GetData($CF_OEMTEXT),2)
                           ConsoleWrite("OEM Text")
                        Case "Unicode Text"
                           Assign("_ClipBoard_UnicodeText",_ClipBoard_GetData($CF_UNICODETEXT),2)
                           ConsoleWrite("Unicode Text")
                        Case "Locale"
                           Assign("_ClipBoard_Locale",_ClipBoard_GetData($CF_LOCALE),2)
                           ConsoleWrite("Locale")
                        Case "Text"
                           Assign("_ClipBoard_Text",_ClipBoard_GetData($CF_TEXT),2)
                           ConsoleWrite("Text")
                        Case "Bitmap"
                           Assign("_ClipBoard_Bitmap",_ClipBoard_GetData($CF_BITMAP),2)
                           ConsoleWrite("Bitmap")
                        Case "DIB V5"
                           Assign("_ClipBoard_DIBV5",_ClipBoard_GetData($CF_DIBV5),2)
                           ConsoleWrite("CF_DIBV5")
                        Case "DIB"
                           Assign("_ClipBoard_DIB",_ClipBoard_GetData($CF_DIB),2)
                           ConsoleWrite("CF_DIB")
                        Case "HDROP"
                           Assign("_ClipBoard_HDROP",_ClipBoard_GetData($CF_HDROP),2)
                           ConsoleWrite("HDROP")
                        EndSwitch
      EndIf
    Until $iFormat = 0
EndFunc
Func _ClipBoard_Restore()

                        if IsDeclared("_ClipBoard_OEMText") Then
                           _ClipBoard_SetData($_ClipBoard_OEMText,$CF_OEMTEXT)
                           $_ClipBoard_OEMText=Null
                        EndIf

                        if IsDeclared("_ClipBoard_UnicodeText") Then
                           _ClipBoard_SetData($_ClipBoard_UnicodeText,$CF_UNICODETEXT)
                           $_ClipBoard_UnicodeText=Null
                        EndIf

                        if IsDeclared("_ClipBoard_Locale") Then
                           _ClipBoard_SetData($_ClipBoard_Locale,$CF_LOCALE)
                           $_ClipBoard_Locale=Null
                        EndIf

                        if IsDeclared("_ClipBoard_Text") Then
                           _ClipBoard_SetData($_ClipBoard_Text,$CF_TEXT)
                           $_ClipBoard_Text=Null
                        EndIf

                        if IsDeclared("_ClipBoard_Bitmap") Then
                           _ClipBoard_SetData($_ClipBoard_Bitmap,$CF_BITMAP)
                           $_ClipBoard_Bitmap=Null
                        EndIf

                        if IsDeclared("_ClipBoard_DIBV5") Then
                           _ClipBoard_SetData($_ClipBoard_DIBV5,$CF_DIBV5)
                           $_ClipBoard_DIBV5=Null
                        EndIf

                        if IsDeclared("_ClipBoard_DIB") Then
                           _ClipBoard_SetData($_ClipBoard_DIB,$CF_DIB)
                           $_ClipBoard_DIB=Null
                        EndIf

                        if IsDeclared("_ClipBoard_HDROP") Then
                           _ClipBoard_SetData($_ClipBoard_HDROP,$CF_HDROP)
                           $_ClipBoard_HDROP=Null
                        EndIf
    ; 关闭剪贴板
    _ClipBoard_Close ()

EndFunc



tubaba 发表于 2022-3-21 10:12:52

不需要你列出剪贴板格式,直接枚举它放入数组Func _Saveclip() ;当前剪贴板数据放入数组中
        Local $iFormat = 0
        If Not _ClipBoard_Open(0) Then Return SetError(1, 1, '')
        Local $iCount = _ClipBoard_CountFormats()
        If $iCount = 0 Then
                _ClipBoard_Close()
                Return SetError(3, 1, '')
        EndIf
        Local $aArray[$iCount], $ID = 0
        Do
                $iFormat = _ClipBoard_EnumFormats($iFormat)
                If $iFormat <> 0 Then
                        Local $hMemory = _ClipBoard_GetDataEx($iFormat)
                        Local $FormatName = _ClipBoard_FormatStr($iFormat)
                        Local $pMemoryBlock = _MemGlobalLock($hMemory)
                        Local $data = ''
                        If $pMemoryBlock <> 0 Then
                                Local $iDataSize = _MemGlobalSize($hMemory)
                                If $iDataSize = 0 Then
                                        _MemGlobalUnlock($hMemory)
                                        _ClipBoard_Close()
                                        Return SetError(2, 1, '')
                                EndIf
                                Local $tData = DllStructCreate('byte buffer[' & $iDataSize & ']', $pMemoryBlock)
                                $data = DllStructGetData($tData, 'buffer')

                        EndIf
                        If UBound($aArray) > $ID Then
                                $aArray[$ID] = $iFormat
                                $aArray[$ID] = $data
                                $aArray[$ID] = $FormatName
                        EndIf
                        $ID += 1
                        _MemGlobalUnlock($hMemory)
                EndIf
        Until $iFormat = 0
        _ClipBoard_Close()
_arraydisplay($aArray)
EndFunc   ;==>_Saveclip

z761003 发表于 2022-3-21 11:41:25

tubaba 发表于 2022-3-21 10:12
不需要你列出剪贴板格式,直接枚举它放入数组

真是高手。。。。前辈,干脆把数组中的数据重新写回到剪贴板也给我写下,我怕我写不好又是绕路:face (11):

z761003 发表于 2022-3-22 08:09:07

tubaba 发表于 2022-3-21 10:12
不需要你列出剪贴板格式,直接枚举它放入数组

前辈,你这个怎么整回去,存在数组里的全是16进制的{:1_625:}

tubaba 发表于 2022-3-22 12:01:07

怎么取出来就怎么放回去啊。取出来是16进制,是因为结构类型。
Func _RestoreClip($aArray) ;将数组中的数据恢复到剪贴板
        If Not _ClipBoard_Open(0) Then Return SetError(1, 0, '')
        If Not _ClipBoard_Empty() Then
                _ClipBoard_Close()
                Return SetError(2, 0, '')
        EndIf
        If UBound($aArray, 0) <> 2 And UBound($aArray, 1) = 0 And UBound($aArray, 2) <> 2 Then
                _ClipBoard_Close()
                Return SetError(3, 0, '')
        EndIf
        For $i = 0 To UBound($aArray) - 1
                If IsBinary($aArray[$i]) Then
                        Local $iSize = BinaryLen($aArray[$i])
                        Local $hMemory = _MemGlobalAlloc($iSize, $GHND)
                        Local $pMemoryBlock = _MemGlobalLock($hMemory)
                        Local $tData = DllStructCreate('byte buffer[' & $iSize + 1 & ']', $pMemoryBlock)
                        DllStructSetData($tData, 'buffer', $aArray[$i])
                        _MemGlobalUnlock($hMemory)
                        _ClipBoard_SetDataEx($hMemory, $aArray[$i])
                EndIf
        Next
        _ClipBoard_Close()
EndFunc   ;==>_RestoreClip

z761003 发表于 2022-3-23 06:11:13

本帖最后由 z761003 于 2022-3-23 06:15 编辑

tubaba 发表于 2022-3-22 12:01
怎么取出来就怎么放回去啊。取出来是16进制,是因为结构类型。
成了,牛叉叉{:1_617:}论坛里高手如云
页: [1]
查看完整版本: 剪贴板数据读出又原样写入[已解决]