#include <GuiEdit.au3>
Opt("MustDeclareVars", 1)
Global $IniPath = StringTrimRight(@ScriptFullPath, 4) & ".ini"
Global $iNewLine = 0, $iOldLine, $iCurrentLine, $ret
Global $sFile, $hWnd, $hEdit, $iPid, $iErr
Open()
$iErr = @error
If $iErr Then
;~ If $iErr > 3 And ProcessExists($iPid) Then ProcessClose($iPid)
If $iErr > 1 Then MsgBox(16+262144, "Ошибка #" & $iErr, "Ошибка открытия") ; $MB_ICONERROR + $MB_TOPMOST
Exit
EndIf
$iOldLine = IniRead($IniPath, "Main", $sFile, 0)
$iCurrentLine = _GUICtrlEdit_GetFirstVisibleLine($hEdit)
_GUICtrlEdit_LineScroll($hEdit, 0, $iOldLine-$iCurrentLine) ;<Восстановление позиции
While WinExists($hWnd) ;<Ожидание закрытия окна
$ret = _GUICtrlEdit_GetFirstVisibleLine($hEdit)
If $ret > 0 Then $iNewLine = $ret
Sleep(500)
WEnd
IniWrite($IniPath, "Main", $sFile, $iNewLine) ;<Сохранение последней позиции для этого файла
Func Open()
$sFile = FileOpenDialog('', '', 'Текстовые файлы (*.txt)|Все (*.*)')
If @error Then Return SetError(1)
$iPid = ShellExecute($sFile)
If @error Then Return SetError(2)
If Not ProcessWait($iPid, 3) Then Return SetError(3)
$hWnd = _FindWindowHandleFromPID($iPid)
If Not $hWnd Then Return SetError(4)
$hEdit = ControlGetHandle($hWnd, "", "[CLASS:Edit]")
If Not $hEdit Or @error Then Return SetError(5)
EndFunc
;~ В случае успеха возвращает идентификатор(HWnd) первого найденого окна принадлежащего указанному процессу ; 0 - если окно отсутствует.
;~ $iPID - Идентификатор процесса. (Процесс должен существовать!)
;~ $sTitle - Заголовок или дескрипторы окна, также это может быть пустой строкой.
;~ $invisible - 0 (по умолчанию) игнорирует невидимые окна, 1 включает в поиск невидимые окна
Func _FindWindowHandleFromPID($iPID, $sTitle='', $invisible=0)
Local $aWinList, $i
$aWinList = $sTitle = "" ? WinList() : WinList($sTitle)
For $i = 1 To $aWinList[0][0]
If WinGetProcess(HWnd($aWinList[$i][1])) = $iPID Then
If $invisible <> 0 Then
Return HWnd($aWinList[$i][1])
Else
If BitAND(WinGetState(HWnd($aWinList[$i][1])), 2) Then Return HWnd($aWinList[$i][1])
EndIf
EndIf
Next
Return 0
EndFunc ;==>_FindWindowHandleFromPID