剪贴板数据读出又原样写入[已解决]
本帖最后由 z761003 于 2022-3-21 05:26 编辑想把当前剪贴板中的内容(可能是文本,也可能是复制了个文件或一位图)读出后暂时放个变量里面,再写入段文本后使用完,想重新把刚读出的内容原封不动写回去,
怎么整?试了下如果原内容为文本的话比较容易
$a=ClipGet()
Clipput("abc")
;使用完后Clipput($a)
可如果原来剪贴板中复制的是图片或文件,研究半天Clipboard.au3楞是没看明白怎么整{:1_618:}
提供思路供参考
1,_ClipBoard_EnumFormats 枚举当前剪贴板内包含的数据格式
2,_ClipBoard_GetData 备份需要的格式所对应的数据(文本或二进制的文件列表、位图数据或其它)
3,你自己的 Clip* 操作
4,_ClipBoard_SetData 将备份的数据放回去 还是一头雾水,:face (9):
比如,我就对准文件夹里某个文件右键点了复制,枚举出来如下
我现在如何用_ClipBoard_GetData 保存,又如何重写进去?
另外,_ClipBoard_GetData 介绍里的格式又是这样的
这两图也不是一一对应的呀
本帖最后由 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
不需要你列出剪贴板格式,直接枚举它放入数组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
tubaba 发表于 2022-3-21 10:12
不需要你列出剪贴板格式,直接枚举它放入数组
真是高手。。。。前辈,干脆把数组中的数据重新写回到剪贴板也给我写下,我怕我写不好又是绕路:face (11): tubaba 发表于 2022-3-21 10:12
不需要你列出剪贴板格式,直接枚举它放入数组
前辈,你这个怎么整回去,存在数组里的全是16进制的{:1_625:} 怎么取出来就怎么放回去啊。取出来是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:15 编辑
tubaba 发表于 2022-3-22 12:01
怎么取出来就怎么放回去啊。取出来是16进制,是因为结构类型。
成了,牛叉叉{:1_617:}论坛里高手如云
页:
[1]