I had some trouble getting your example to work properly, and after i read up on it on MSDN it became a little clearer ;)
SetClipboardData takes over ownership if its data so passing it anything other than memory handles from GlobalAlloc/LocalAlloc resulted in failure (atleast on my end ;)
this is how i got it work:
SuperStrict
'
' Clipboard
'
Const CF_TEXT:Int = 1
Const CF_BITMAP:Int = 2
Const CF_METAFILEPICT:Int = 3
Const CF_SYLK:Int = 4
Const CF_DIF:Int = 5
Const CF_TIFF:Int = 6
Const CF_OEMTEXT:Int = 7
Const CF_DIB:Int = 8
Const CF_PALETTE:Int = 9
Const CF_PENDATA:Int = 10
Const CF_RIFF:Int = 11
Const CF_WAVE:Int = 12
Const CF_UNICODETEXT:Int = 13
Const CF_ENHMETAFILE:Int = 14
Const CF_HDROP:Int = 15
Const CF_LOCALE:Int = $10
Const CF_MAX:Int = 17
Const CF_DIBV5:Int = 17
Extern "win32"
Function OpenClipboard:Int( hwnd:Int = 0) = "OpenClipboard@4"
Function CloseClipboard:Int() = "CloseClipboard@0"
Function GetClipboardData:Int( format:Int) = "GetClipboardData@4"
Function SetClipboardData:Int( format:Int, handle:Int) = "SetClipboardData@8"
Function EmptyClipboard:Int() = "EmptyClipboard@0"
Function IsClipboardFormatAvailable:Int( format:Int) = "IsClipboardFormatAvailable@4"
EndExtern
'
' Global Memory
'
Const GMEM_FIXED:Int = 0
Const GMEM_MOVEABLE:Int = 2
Const GMEM_NOCOMPACT:Int = $10
Const GMEM_NODISCARD:Int = $20
Const GMEM_ZEROINIT:Int = $40
Const GMEM_MODIFY:Int = $80
Const GMEM_DISCARDABLE:Int = $100
Const GMEM_NOT_BANKED:Int = $1000
Const GMEM_SHARE:Int = $2000
Const GMEM_DDESHARE:Int = $2000
Const GMEM_NOTIFY:Int = $4000
Const GMEM_LOWER:Int = GMEM_NOT_BANKED
Const GMEM_VALID_FLAGS:Int = 32626
Const GMEM_INVALID_HANDLE:Int = $8000
Const GHND:Int = GMEM_MOVEABLE | GMEM_ZEROINIT
Const GPTR:Int = GMEM_FIXED | GMEM_ZEROINIT
Extern "win32"
Function GlobalAlloc:Int( flags:Int, size:Int) = "GlobalAlloc@8"
Function GlobalReAlloc:Int( mem:Int, size:Int, flags:Int) = "GlobalReAlloc@8"
Function GlobalSize:Int( mem:Int) = "GlobalSize@4"
Function GlobalFlags:Int( mem:Int) = "GlobalFlags@4"
Function GlobalLock:Byte Ptr( mem:Int) = "GlobalLock@4"
Function GlobalHandle:Int( mem:Byte Ptr) = "GlobalHandle@4"
Function GlobalUnlock:Int( mem:Int) = "GlobalUnlock@4"
Function GlobalFree:Int( mem:Int) = "GlobalFree@4"
EndExtern
Function WriteClipboardText( s:String)
If s = Null Then Return
If OpenClipboard() Then
Local data:Int = GlobalAlloc( GMEM_MOVEABLE, s.Length + 1)
Local p:Byte Ptr = GlobalLock( data)
MemCopy( p, s.ToCString(), s.Length + 1)
GlobalUnlock( data)
EmptyClipboard()
SetClipboardData( CF_TEXT, data)
CloseClipboard()
GlobalFree( data)
EndIf
EndFunction
Function ReadClipboardText:String()
Local s:String
If OpenClipboard() Then
If IsClipboardFormatAvailable( CF_TEXT) Then
Local data:Int = GetClipboardData( CF_TEXT)
Local p:Byte Ptr = GlobalLock( data)
s = String.FromCString( p)
GlobalUnlock( data)
EndIf
CloseClipboard()
EndIf
Return s
EndFunction
WriteClipboardText( "Hello World!")
Print "read: " + ReadClipboardText()
If i understood your question properly you want to append data to the clipboard? than this should suffice.
Function AppendClipboardText( s:String)
WriteClipboardText( ReadClipboardText() + s)
EndFunction
hope this helps =)
|