Code: Select all
clipArr := []
k := 1
Return
$F1:: clipArr.Push( SaveClipboard() )
$F2::
if !clipArr[1]
Return
SetClipboardData( clipArr[k++] )
(k > clipArr.MaxIndex() && k := 1)
Send ^v
Return
SaveClipboard() {
static CF_ENHMETAFILE := 14
clipContent := {}, clipFormat := 0
DllCall("OpenClipboard", Ptr, 0)
while clipFormat := DllCall("EnumClipboardFormats", UInt, clipFormat) {
hMem := DllCall("GetClipboardData", UInt, clipFormat, Ptr)
if (clipFormat = CF_ENHMETAFILE) {
size := DllCall("GetEnhMetaFileBits", Ptr, hMem, UInt, 0, Ptr, 0)
clipContent.SetCapacity(clipFormat, size)
DllCall("GetEnhMetaFileBits", Ptr, hMem, UInt, size, Ptr, clipContent.GetAddress(clipFormat))
}
else {
pMem := DllCall("GlobalLock", Ptr, hMem, Ptr)
size := DllCall("GlobalSize", Ptr, pMem)
clipContent.SetCapacity(clipFormat, size)
DllCall("RtlMoveMemory", Ptr, clipContent.GetAddress(clipFormat), Ptr, pMem, Ptr, size)
DllCall("GlobalUnlock", Ptr, hMem)
}
}
DllCall("CloseClipboard")
Return clipContent
}
SetClipboardData(clipContent) {
static CF_ENHMETAFILE := 14, flags := (GMEM_ZEROINIT := 0x40) | (GMEM_MOVEABLE := 0x2)
DllCall("OpenClipboard", Ptr, 0)
DllCall("EmptyClipboard")
for clipFormat in clipContent {
addr := clipContent.GetAddress(clipFormat), size := clipContent.GetCapacity(clipFormat)
if (clipFormat = CF_ENHMETAFILE) {
hData := DllCall("SetEnhMetaFileBits", UInt, size, Ptr, addr, Ptr)
DllCall("SetClipboardData", UInt, CF_ENHMETAFILE, Ptr, hData, Ptr)
DllCall("DeleteEnhMetaFile", Ptr, hData)
}
else {
hMem := DllCall("GlobalAlloc", UInt, flags, Ptr, size, Ptr)
pMem := DllCall("GlobalLock", Ptr, hMem, Ptr)
DllCall("RtlMoveMemory", Ptr, pMem, Ptr, addr, Ptr, size)
DllCall("SetClipboardData", UInt, clipFormat, Ptr, pMem, Ptr)
DllCall("GlobalUnlock", Ptr, hMem)
}
}
DllCall("CloseClipboard")
}