#Include <ProcessConstants.au3>
#Include <WinAPI.au3>
#Include <EditConstants.au3>
#Include <GUIConstantsEx.au3>

If StringInStr($CmdLineRaw, '--TestRun') Then
	_ReadWriteMemory()
	Exit
EndIf

$iVal = 100
$t = DllStructCreate('WORD')
DllStructSetData($t, 1, $iVal)

$hForm = GUICreate("Тестовая программа", 274, 97, -1, -1)
GUICtrlCreateLabel("Адрес памяти :", 60, 24, 81, 17)
GUICtrlCreateInput(DllStructGetPtr($t), 160, 20, 89, 21, BitOR($GUI_SS_DEFAULT_INPUT,$ES_CENTER,$ES_READONLY,$ES_NUMBER))
GUICtrlCreateLabel("Значение памяти :", 44, 60, 98, 17)
$Input = GUICtrlCreateInput(DllStructGetData($t, 1), 160, 56, 89, 21, BitOR($GUI_SS_DEFAULT_INPUT,$ES_CENTER,$ES_READONLY,$ES_NUMBER))
GUISetState(@SW_SHOW)

Sleep(1000)
If @Compiled Then
	Run('"' & @ScriptFullPath & '" --TestRun')
Else
	Run(FileGetShortName(@AutoItExe) & ' /AutoIt3ExecuteScript "' & FileGetShortName(@ScriptFullPath) & '" --TestRun')
EndIf

$begin = TimerInit()
While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
	EndSwitch
	If TimerDiff($begin) > 200 Then
		$tmp = DllStructGetData($t, 1)
		If $iVal <> $tmp Then
			$iVal = $tmp
			GUICtrlSetData($Input, $iVal)
		EndIf
		$begin = TimerInit()
	EndIf
WEnd

Func _ReadWriteMemory()
	$hWnd = WinGetHandle('[Title:Тестовая программа; Class:AutoIt v3 GUI]')
	If $hWnd Then
		$iPid = WinGetProcess($hWnd)
		If $iPid Then
			$iAddress = ControlGetText($hWnd, '', '[Class:Edit; Instance:1]')
			If $iAddress > 0 Then
				$iAddress = Int($iAddress);адрес памяти внешнего процесса
				$hProcess = _WinAPI_OpenProcess($PROCESS_ALL_ACCESS, 0, $iPid)
				If $hProcess Then
					Local $iRead, $iWrite, $t = DllStructCreate('WORD')
					For $i = 1 To 10
						If ProcessExists($iPid) Then
							; Чтение значения памяти
							_WinAPI_ReadProcessMemory($hProcess, $iAddress, DllStructGetPtr($t), 2, $iRead)
							$iVal = DllStructGetData($t, 1)
							$iVal += 5
							; Запись значения в память
							DllStructSetData($t, 1, $iVal)
							_WinAPI_WriteProcessMemory($hProcess, $iAddress, DllStructGetPtr($t), 2, $iWrite)
						Else
							ExitLoop
						EndIf
						Sleep(1000)
					Next
					If ProcessExists($iPid) Then
						_WinAPI_CloseHandle($hProcess); Открытый процесс необходимо закрывать
					EndIf
				Else
					MsgBox(16+4096, 'Ошибка', 'Не удалось открыть память тестовой программы')
				EndIf
			Else
				MsgBox(16+4096, 'Ошибка', 'Не найден адрес памяти тестовой программы')
			EndIf
		Else
			MsgBox(16+4096, 'Ошибка', 'Не найден процесс тестовой программы')
		EndIf
	Else
		MsgBox(16+4096, 'Ошибка', 'Не найдено окно тестовой программы')
	EndIf
EndFunc