找回密码
 加入
搜索
查看: 905|回复: 8

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

[复制链接]
发表于 2022-3-20 17:15:23 | 显示全部楼层 |阅读模式
本帖最后由 z761003 于 2022-3-21 05:26 编辑

想把当前剪贴板中的内容(可能是文本,也可能是复制了个文件或一位图)读出后暂时放个变量里面,再写入段文本后使用完,想重新把刚读出的内容原封不动写回去,
怎么整?试了下如果原内容为文本的话比较容易
$a=ClipGet()
Clipput("abc")
;使用完后Clipput($a)
可如果原来剪贴板中复制的是图片或文件,研究半天Clipboard.au3楞是没看明白怎么整
发表于 2022-3-20 18:29:07 | 显示全部楼层
提供思路供参考
1,_ClipBoard_EnumFormats 枚举当前剪贴板内包含的数据格式
2,_ClipBoard_GetData 备份需要的格式所对应的数据(文本或二进制的文件列表、位图数据或其它)
3,你自己的 Clip* 操作
4,_ClipBoard_SetData 将备份的数据放回去
 楼主| 发表于 2022-3-20 23:13:41 | 显示全部楼层
还是一头雾水,
比如,我就对准文件夹里某个文件右键点了复制,枚举出来如下
我现在如何用_ClipBoard_GetData 保存,又如何重写进去?
另外,_ClipBoard_GetData 介绍里的格式又是这样的

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
 楼主| 发表于 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



发表于 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][3], $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][0] = $iFormat
                                $aArray[$ID][1] = $data
                                $aArray[$ID][2] = $FormatName
                        EndIf
                        $ID += 1
                        _MemGlobalUnlock($hMemory)
                EndIf
        Until $iFormat = 0
        _ClipBoard_Close()
_arraydisplay($aArray)
EndFunc   ;==>_Saveclip

 楼主| 发表于 2022-3-21 11:41:25 | 显示全部楼层
tubaba 发表于 2022-3-21 10:12
不需要你列出剪贴板格式,直接枚举它放入数组

真是高手。。。。前辈,干脆把数组中的数据重新写回到剪贴板也给我写下,我怕我写不好又是绕路
 楼主| 发表于 2022-3-22 08:09:07 | 显示全部楼层
tubaba 发表于 2022-3-21 10:12
不需要你列出剪贴板格式,直接枚举它放入数组

前辈,你这个怎么整回去,存在数组里的全是16进制的
发表于 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][1]) Then
                        Local $iSize = BinaryLen($aArray[$i][1])
                        Local $hMemory = _MemGlobalAlloc($iSize, $GHND)
                        Local $pMemoryBlock = _MemGlobalLock($hMemory)
                        Local $tData = DllStructCreate('byte buffer[' & $iSize + 1 & ']', $pMemoryBlock)
                        DllStructSetData($tData, 'buffer', $aArray[$i][1])
                        _MemGlobalUnlock($hMemory)
                        _ClipBoard_SetDataEx($hMemory, $aArray[$i][0])
                EndIf
        Next
        _ClipBoard_Close()
EndFunc   ;==>_RestoreClip

 楼主| 发表于 2022-3-23 06:11:13 | 显示全部楼层
本帖最后由 z761003 于 2022-3-23 06:15 编辑
tubaba 发表于 2022-3-22 12:01
怎么取出来就怎么放回去啊。取出来是16进制,是因为结构类型。

成了,牛叉叉论坛里高手如云
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-5-4 07:40 , Processed in 0.077657 second(s), 20 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表