#include <Constants.au3>
#include <GuiConstantsEx.au3>
#include <WindowsConstants.au3>
#include <ButtonConstants.au3>


Global $kernel32dll		=	DllOpen ("kernel32.dll")
Global $user32dll		=	DllOpen ("user32.dll")


Global Const $HEAP_NO_SERIALIZE	=	0x00000001

Global Const $CF_RTF	=	"Rich Text Format"
Global Const $MAX_PATH	=	260

Global $IDC_BUTTON_GETTEXT

Global $uRtfTextFormat


Exit (Main ( ))

Func Main ( )

	Local $hwnd
	Local $sText


	$uRtfTextFormat = RegisterClipboardFormat ($CF_RTF)

	If (not $uRtfTextFormat) Then _
		Return -1

	$hwnd = GUICreate ("CF_RTF Demo")

	$IDC_BUTTON_GETTEXT = GUICtrlCreateButton ("Start", 30, 200, 75)

	GUISetState (@SW_SHOW, $hwnd)

	While (TRUE)

		Switch (GUIGetMsg (FALSE))

			Case $IDC_BUTTON_GETTEXT
				GetRtfFromClipboard ($hwnd, $sText)
				ConsoleWrite ("--- sText : "&$sText & @CRLF)

			Case $GUI_EVENT_CLOSE
				ExitLoop
		EndSwitch
	WEnd

	Return 0

EndFunc


Func GetRtfFromClipboard ($hwnd, ByRef $sRtfString)

	Local $hClipboardData
	Local $sFormatName
	Local $lpMem
	Local $uSize
	Local $rtf


	If (not OpenClipboard ($hwnd)) Then _
		Return FALSE

	GetClipboardFormatName ($uRtfTextFormat, $sFormatName, $MAX_PATH)

	If ($sFormatName == $CF_RTF) Then

		$hClipboardData = GetClipboardData ($uRtfTextFormat)

		If ($hClipboardData) Then

			$lpMem = GlobalLock ($hClipboardData)

			If ($lpMem) Then

				$uSize = GlobalSize ($hClipboardData)

				$rtf = DllStructCreate ("CHAR["&$uSize&"]", $hClipboardData)

				If (not @error) Then
					$sRtfString = DllStructGetData ($rtf, 1)

					GlobalUnlock ($hClipboardData)
					Return TRUE
				Else
					GlobalUnlock ($hClipboardData)
				EndIf
			EndIf
		EndIf
	EndIf

	CloseClipboard ( )

	Return FALSE

EndFunc


;лллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл

Func CloseClipboard ( )

	Local $aRes = DllCall ($user32dll, 'int', 'CloseClipboard')
	Return $aRes[0]

EndFunc

Func GetClipboardData ($uFormat)

	Local $aRes = DllCall ($user32dll, 'ptr', 'GetClipboardData', _
								'uint', $uFormat)
	Return $aRes[0]

EndFunc

Func GetClipboardFormatName ($format, ByRef $lpszFormatName, $cchMaxCount)

	Local $type = 'wstr'
	If (IsPtr ($lpszFormatName)) Then $type = 'ptr'

	Local $aRes = DllCall ($user32dll, 'int', 'GetClipboardFormatNameW', _
								'uint', $format, _
								$type, $lpszFormatName, _
								'int', $cchMaxCount)
	If (not @error) Then _
		$lpszFormatName = $aRes[2]

	Return $aRes[0]

EndFunc

Func OpenClipboard ($hWndNewOwner)

	Local $aRes = DllCall ($user32dll, 'int', 'OpenClipboard', _
								'hwnd', $hWndNewOwner)
	Return $aRes[0]

EndFunc

Func RegisterClipboardFormat ($lpszFormat)

	Local $aRes = DllCall ($user32dll, 'uint', 'RegisterClipboardFormatW', _
								'wstr', $lpszFormat)
	Return $aRes[0]

EndFunc

Func GlobalLock ($hMem)

	Local $aRes = DllCall ($kernel32dll, 'PTR', 'GlobalLock', _
								'PTR', $hMem)
	Return $aRes[0]

EndFunc

Func GlobalSize ($hMem)

	If (@OSArch == "X86") Then

		Local $aRes = DllCall ($kernel32dll, 'ULONG', 'GlobalSize', _
									'PTR', $hMem)
	Else
		Local $aRes = DllCall ($kernel32dll, 'ULONG_PTR', 'GlobalSize', _
									'PTR', $hMem)
	EndIf
	Return $aRes[0]

EndFunc

Func GlobalUnlock ($hMem)

	Local $aRes = DllCall ($kernel32dll, 'INT', 'GlobalUnlock', _
								'PTR', $hMem)
	Return $aRes[0]

EndFunc




Func GetProcessHeap ( )

	Local $aRes = DllCall ($kernel32dll, 'PTR', 'GetProcessHeap')
	Return $aRes[0]

EndFunc

Func HeapLock ($hHeap)

	Local $aRes = DllCall ($kernel32dll, 'INT', 'HeapLock', _
								'PTR', $hHeap)
	Return $aRes[0]

EndFunc

Func HeapSize ($hHeap, $dwFlags, $lpMem)

	If (@OSArch == "X86") Then

		Local $aRes = DllCall ($kernel32dll, 'ULONG', 'HeapSize', _
									'PTR', $hHeap, _
									'DWORD', $dwFlags, _
									'PTR', $lpMem)
	Else

		Local $aRes = DllCall ($kernel32dll, 'ULONG_PTR', 'HeapSize', _
									'PTR', $hHeap, _
									'DWORD', $dwFlags, _
									'PTR', $lpMem)
	EndIf
	Return $aRes[0]

EndFunc

Func HeapUnlock ($hHeap)

	Local $aRes = DllCall ($kernel32dll, 'INT', 'HeapUnlock', _
								'PTR', $hHeap)
	Return $aRes[0]

EndFunc


