Jump to content
Sign in to follow this  

_ClipBoard_GetDataEx to array

Recommended Posts

i want to use _ClipBoard_GetDataEx in a loop to retrieve all data from the clipboard and copy it into an array, similar to ?do=embed' frameborder='0' data-embedContent>>_ClipBoard_GetAll by wraithdu, but without the extra memory stuff

Basically all i did was to comment out the memory parts of ?do=embed' frameborder='0' data-embedContent>>_ClipBoard_GetAll, but it doesn't work because the data that gets restored is not the data that was copied into the array

Looking at _ClipBoard_GetDataEx in the help file, i think i am missing the dll stuff...

$tData = DllStructCreate("char Text[8192]", $hMemory)
DllStructGetData($tData, "Text")

The problem is that i don't know how to write the dll functions when the clipboard format (char Text[8192]) could be anything

Here's what i have so far...

#include <Clipboard.au3>
#include <Array.au3>

Global $avClip, $iErr = 0

ConsoleWrite("-------- GET --------" & @LF)
If @error Then
    ConsoleWrite("_Clipboard_GetAll error = " & @error & @LF)
ConsoleWrite("-------- PUT --------" & @LF)
If @error Then ConsoleWrite("_ClipBoard_PutAll error = " & @error & @LF)

; http://www.autoitscript.com/forum/topic/81267-clipboard-getall-clipboard-putall-clipboard-wait/

Func _Clipboard_GetAll(ByRef $avClip)

    Local $iFormat = 0, $hMem, $hMem_new, $pSource, $pDest, $iSize, $iErr = 0, $iErr2 = 0

    Dim $avClip[1][2]

    If Not _ClipBoard_Open(0) Then Return SetError(-1, 0, 0)
        $iFormat = _ClipBoard_EnumFormats($iFormat)
        If $iFormat <> 0 Then
            $hMem = _ClipBoard_GetDataEx($iFormat)
            If $hMem = 0 Then
                $iErr += 1
            ReDim $avClip[UBound($avClip) + 1][2]
            $avClip[0][0] += 1
            $avClip[UBound($avClip) - 1][0] = $hMem
            $avClip[UBound($avClip) - 1][1] = $iFormat
    Until $iFormat = 0

    Local $ErrRet = 0
    If $iErr Then $ErrRet -= 2
    If $ErrRet Then
        Return SetError($ErrRet, $iErr, 0)
        Return 1

Func _ClipBoard_PutAll(ByRef $avClip)

    Local $iErr = 0

    If Not IsArray($avClip) Or UBound($avClip, 0) <> 2 Or $avClip[0][0] <= 0 Then Return SetError(-1, 0, 0)

    If Not _ClipBoard_Open(0) Then Return SetError(-2, 0, 0)
    If Not _ClipBoard_Empty() Then
        Return SetError(-3, 0, 0)
    ; seems to work without closing / reopening the clipboard, but MSDN implies we should do this
    ; since a call to EmptyClipboard after opening with a NULL handle sets the owner to NULL,
    ; and SetClipboardData is supposed to fail, so we close and reopen it to be safe
    If Not _ClipBoard_Open(0) Then Return SetError(-3, 0, 0)
    For $i = 1 To $avClip[0][0]
        If _ClipBoard_SetDataEx($avClip[$i][0], $avClip[$i][1]) = 0 Then $iErr += 1
    If $iErr Then
        Return SetError(-4, $iErr, 0)
        Return 1
Edited by iCode

FUNCTIONS: WinDock (dock window to screen edge) | EditCtrl_ToggleLineWrap (line/word wrap for AU3 edit control) | SendEX (yet another alternative to Send( ) ) | Spell Checker (Hunspell wrapper) | SentenceCase (capitalize first letter of sentences)

CODE SNIPPITS: Dynamic tab width (set tab control width according to window width)

Share this post

Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

  • Create New...