#include <GUIConstantsEx.au3>
#include <Clipboard.au3>
#include <WinAPI.au3>
#include <WindowsConstants.au3>

Global $iMemo

_Main()

Func _Main()
	Local $hGUI, $btn_SetData, $btn_GetData, $hMemory, $hLock, $tData, $sData, $iSize

	; Создаёт GUI
	$hGUI = GUICreate("Clipboard", 600, 450)
	$iMemo = GUICtrlCreateEdit("", 2, 2, 596, 396, $WS_VSCROLL)
	GUICtrlSetFont($iMemo, 9, 400, 0, "Courier New")
	$btn_SetData = GUICtrlCreateButton("Вставить в буфер обмена", 120, 410, 160, 30)
	$btn_GetData = GUICtrlCreateButton("Получить из буфера обмена", 320, 410, 160, 30)
	GUISetState()

	; Цикл выполняется, пока окно не будет закрыто
	While 1
		Switch GUIGetMsg()
			Case $GUI_EVENT_CLOSE
				ExitLoop
			Case $btn_SetData
				; Открывает буфер обмена
				If _ClipBoard_Open(0) Then

					; Очищает буфер обмена
					If _ClipBoard_Empty() Then

						; Создаёт буфер в памяти (показывает, насколько использование _ClipBoard_SetData гораздо проще!)
						$sData = "Приветствие от AutoIt"
						$iSize = StringLen($sData) + 1
						$hMemory = _MemGlobalAlloc($iSize, $GHND)
						If $hMemory <> 0 Then
							$hLock = _MemGlobalLock($hMemory)
							If $hLock = 0 Then _WinAPI_ShowError("Ошибка функции _Mem_GlobalLock")
							$tData = DllStructCreate("char Text[" & $iSize & "]", $hLock)
							DllStructSetData($tData, "Text", $sData)
							_MemGlobalUnlock($hMemory)

							; Помещает текст в буфер обмена
							If Not _ClipBoard_SetDataEx($hMemory, $CF_TEXT) Then _WinAPI_ShowError("Ошибка функции _ClipBoard_SetDataEx")
						Else
							_WinAPI_ShowError("Ошибка функции _Mem_GlobalAlloc")
						EndIf

						; Закрывает буфер обмена
						_ClipBoard_Close()
					Else
						; Закрывает буфер обмена
						_ClipBoard_Close()
						_WinAPI_ShowError("Ошибка функции _ClipBoard_Empty")
					EndIf
				Else
					_WinAPI_ShowError("Ошибка функции _ClipBoard_Open")
				EndIf

			Case $btn_GetData
				MemoWrite(_ClipBoard_GetData())
		EndSwitch
	WEnd

EndFunc   ;==>_Main

; Записывает строку в элемент для заметок
Func MemoWrite($sMessage = "")
	GUICtrlSetData($iMemo, $sMessage & @CRLF, 1)
EndFunc   ;==>MemoWrite