Что нового

Полоса прокрутки(Scroll)

dardreams

Новичок
Сообщения
2
Репутация
0
Что я пытаюсь выполнить?
Подскажите можно ли в AutoIt узнать расположение полосы прокрутки в приложении например Notepad Windows

Что я ожидаю от выполненных действии?
Чтобы После открытия Notepad полоса прокрутки автоматически меняла расположение на то что было при закрытии.
 

Diamond

Меценат
Меценат
Сообщения
15
Репутация
1
Может по расположению первой строки в зоне видимости?

Код/Пример:
Код:
#include <GuiEdit.au3>
#include <ScrollBarsConstants.au3>

Run("notepad.exe")
$hWnd = WinWaitActive("[CLASS:Notepad]", "", 3)
If $hWnd = 0 Then Exit

$hEdit = ControlGetHandle($hWnd, "", "[CLASS:Edit]")

Global $Str
For $i = 0 To 1000
    $Str &= StringFormat("[%04i]", $i) & @CRLF
Next
ControlSetText($hWnd, "", $hEdit, $Str)
_GUICtrlEdit_LineScroll ( $hEdit, 0, Random(0, 1000, 1))

$iFirstVisibleLine = _GUICtrlEdit_GetFirstVisibleLine($hEdit)
MsgBox(0, "", "Запоминаем последнюю позицию: " & $iFirstVisibleLine)

_GUICtrlEdit_LineScroll ( $hEdit, 0, Random(-500, 500, 1))
MsgBox(0, "", "Cлучайный сброс позиции")

$CurrentLine = _GUICtrlEdit_GetFirstVisibleLine($hEdit)
_GUICtrlEdit_LineScroll( $hEdit, 0, $iFirstVisibleLine-$CurrentLine)
MsgBox(0, "", "Позиция восстановлена!")


Рабочий скрипт который отслеживает позицию и записывает её в INI-файл. Для каждого текстового файла - отдельная запись. Чтобы отследить несколько файлов придется запускать несколько копий этого скрипта.
Проверял в Windows 7 на блокноте.
Скрипт:
Код:
#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
 
Последнее редактирование:
  • Like
Реакции: Norm
Автор
D

dardreams

Новичок
Сообщения
2
Репутация
0
Спасибо большое! Очень интересная идея!
 

Diamond

Меценат
Меценат
Сообщения
15
Репутация
1
Я немного оптимизировал скрипт, чтобы он предупреждал в случае ошибки.
 
Верх