Перейти на главную страничку сайта (список статей, файлы для скачивания)

ФОРУМ (здесь можно обсудить эту статью, а также саму программу AutoHotkey и проблемы её использования)

Проект перевода документации AutoHotkey: перечень переведённых статей и статей в работе.

Оригинал статьи в AutoHotkey.chm: "ControlGet", в содержании - "Window Management" - "Controls" - "ControlGet", v1.0.46.03.

Ник переводчика: YMP.

Настоящее имя переводчика: Юрий Попов.

ControlGet

Считывает разнообразную информацию о контролах (элементах управления) окна.

ControlGet, OutputVar, Cmd [, Value, Control, WinTitle, WinText, ExcludeTitle, ExcludeText]

Параметры

OutputVar Имя выходной переменной, куда будет помещён результат выполнения команды.
Cmd, Value См. список ниже.
Control Может задаваться как ClassNN (имя класса и номер данного экземпляра) или как имя/текст контрола. Все эти значения можно определить, используя программу Window Spy. При использовании имени/текста параметры их поиска можно задавать командой SetTitleMatchMode. Если параметр пустой, используется верхний контрол окна.

Чтобы указать контрол через его HWND (window handle, идентификатор окна), оставьте параметр Control пустым и задайте ahk_id %ControlHwnd% как значение параметра WinTitle - это работает также и для скрытых контролов, даже если обнаружение скрытых окон (команда DetectHiddenWindows) не включено. HWND, как правило, узнаётся через команды ControlGet Hwnd, MouseGetPos или DllCall.
WinTitle Заголовок или часть заголовка окна (параметры поиска можно задавать командой SetTitleMatchMode). Если этот и следующие 3 параметра опущены, будет использовано последнее найденное окно. Если параметр задан буквой А и следующие 3 параметра опущены, будет использовано активное окно. Чтобы задать окно через его класс, используйте конструкцию ahk_class ТочноеИмяКласса (можно посмотреть программой Window Spy). Чтобы использовать идентификатор процесса (PID), задайте параметр как ahk_pid %ПеременнаяСодержащаяPID%. Чтобы использовать группу окон, задайте параметр как ahk_group ИмяГруппы. Чтобы использовать идентификатор окна, задайте параметр как ahk_id %ПеременнаяСодержащаяID%. Сектор поиска можно сузить, задав несколько критериев, например, My File.txt ahk_class Notepad.
WinText Подстрока из одиночного текстового элемента окна (можно посмотреть программой Window Spy). Скрытые текстовые элементы определяются, если включено определение скрытого текста (команда DetectHiddenText).
ExcludeTitle Окна, чей заголовок включает значение этого параметра, исключаются.
ExcludeText Окна, чей текст включает значение этого параметра, исключаются.

Cmd, Value

Параметры Cmd и Value зависят друг от друга, их использование показано ниже.

List возвращает список, содержащийся в контроле ListView, ListBox, ComboBox или DropDownList.

ListView [v1.0.37+]: самый распространённый пример ListView - это список файлов и папок в Проводнике (Рабочий стол - это тоже ListView). Синтаксис для считывания ListView таков:

ControlGet, OutputVar, List, Options, SysListView321, WinTitle, WinText

Если параметр Options опущен или пустой, считывается весь текст контрола. Каждая строка кроме последней завершается переводом строки (`n). Внутри каждой строки каждое поле (колонка) кроме последнего заканчивается табуляцией (`t).

Параметр Options также может принимать одно или более из следующих значений (разделяйте их пробелами или табуляцией):

Selected считывает только выделенные (подсвеченные) строки. Если таких нет, выходная переменная будет пустой.

Focused считывает только строку, на которой фокус. Если таких нет, выходная переменная будет пустой.

Col4 считывает только четвёртую колонку (поле). Замените 4 на нужный номер.

Count возвращает общее число строк.

Count Selected возвращает число выделенных (подсвеченных) строк.

Count Focused возвращает номер (позицию) строки, на которой фокус. Если такой нет, возвращает 0.

Count Col возвращает общее число колонок. Если определить это число не удаётся, вернёт -1.

Примечание: некоторые приложения хранят текст своих ListView таким образом (privately), что считать его не удаётся. В таких случаях ErrorLevel принимает значение 0 (показывая успех), но все считанные поля будут пустыми. Также заметьте, что считывание текста ListView не ограничивается директивой #MaxMem.

В случае успеха ErrorLevel принимает значение 0. В случае неудачи он будет равен 1 и выходная переменная будет пустой. Неудача возможна в следующих случаях: 1) указанное окно или контрол не существуют; 2) указанный контрол иного типа чем SysListView32; 3) процесс, которому принадлежит ListView, не может быть открыт, возможно, из-за недостатка прав у пользователя или потому, что процесс заблокирован (locked); 4) опция ColN указывает на несуществующую колонку.

Чтобы считывать строки и поля ListView индивидуально, используйте цикл разбора, как в следующем примере:

ControlGet, List, List, Selected, SysListView321, WinTitle
Loop, Parse, List, `n ; Строки разделены символом новой строки (`n).
{
    RowNumber := A_Index
    Loop, Parse, A_LoopField, %A_Tab% ; Поля (колонки) разделены табуляцией (A_Tab).
        MsgBox Row #%RowNumber% Col #%A_Index% is %A_LoopField%.
}

Примечание: ширину колонок в ListView можно изменять через команду SendMessage, как в примере ниже:

SendMessage, 4126, 0, 80, SysListView321, WinTitle ; 4126 - сообщение LVM_SETCOLUMNWIDTH.

В примере выше 0 означает первую колонку (1 - вторая и т.д.). 80 - новая ширина. Замените 80 на -1 для автоматической установки ширины. Значение -2 делает то же, но также учитывает ширину текста заголовка колонки.

ListBox, ComboBox, DropDownList: считывается весь текст контрола (т.е. опции для ListView, такие как Count и Selected, не поддерживаются). Версия 1.0.42 и более поздние также поддерживают контролы TListBox, TComboBox и, возможно, другие.

Каждая строка кроме последней завершается символом перевода строки (`n). Чтобы считывать элементы индивидуально, используйте цикл разбора, как в примере ниже:

ControlGet, List, List,, ComboBox1, WinTitle
Loop, Parse, List, `n
    MsgBox Элемент номер %A_Index% содержит %A_LoopField%.

Checked помещает 1 в выходную переменную, если указанный флажок либо переключатель отмечены; если не отмечены, помещает 0.

Enabled помещает 1 в выходную переменную, если контрол действует, и 0, если заблокирован.

Visible помещает 1 в выходную переменную, если контрол видим, и 0, если скрыт.

Tab помещает в выходную переменную номер вкладки контрола SysTabControl32 (нумерация вкладок с 1). Чтобы определить общее количество вкладок, следуйте примеру ниже:

SendMessage, 0x1304,,, SysTabControl321, WinTitle ; 0x1304 - сообщение TCM_GETITEMCOUNT.
TabCount = %ErrorLevel%

FindString, String помещает в выходную переменную номер элемента контрола ListBox или ComboBox, текст которого в точности совпадает со значением String. Версия 1.0.42 и более поздние также поддерживают контролы TListBox, TComboBox и, возможно, другие. Нумерация элементов с 1. Если совпадений не найдено, выходная переменная будет пустой и ErrorLevel=1.

Choice помещает в выходную переменную имя выделенного (выбранного) элемента из ListBox или ComboBox. Версия 1.0.42 и более поздние также поддерживают контролы TListBox, TComboBox и, возможно, другие. Чтобы определить позицию выделенного элемента, следуйте примеру ниже (используйте только одну из первых двух строк):

SendMessage, 0x188, 0, 0, ListBox1, WinTitle ; 0x188 - сообщение LB_GETCURSEL (для ListBox).
SendMessage, 0x147, 0, 0, ComboBox1, WinTitle ; 0x147 - сообщение CB_GETCURSEL (для DropDownList или ComboBox).
ChoicePos = %ErrorLevel% ; Будет равен -1, если выделенных элементов нет.
ChoicePos += 1 ; Перейти от нумерации с 0 к нумерации с 1.

LineCount помещает в выходную переменную общее число строк в контроле Edit. Все контролы Edit имеют хотя бы одну строку, даже если они пустые.

CurrentLine помещает в выходную переменную номер строки в контроле Edit, на которой находится каретка (текстовый курсор). Нумерация с 1. Если часть текста выделена, в выходной переменной будет номер строки, где находится начало выделения.

CurrentCol помещает в выходную переменную номер столбца в контроле Edit, на котором находится каретка (текстовый курсор). Нумерация с 1. Если часть текста выделена, в выходной переменной будет номер столбца, где находится начало выделения.

Line, N помещает в выходную переменную текст строки с номером N из контрола Edit. Нумерация с 1. В зависимости от особенностей контрола, считанная строка может оканчиваться возвратом каретки (`r) либо возвратом каретки и переводом строки (`r`n).

Selected помещает в выходную переменную выделенный текст из контрола Edit. Если выделенного текста нет, переменная будет пустой и ErrorLevel=0 (успех). Некоторые разновидности контрола, такие как RichEdit20A могут не возвращать правильного текста в некоторых случаях (например, в Metapad).

Style возвращает 8-значное шестнадцатеричное число, обозначающее стиль контрола. Некоторые номера стилей можно посмотреть в статье "Стили, используемые командами Gui и GuiControl" ("Styles Usable by the Gui and GuiControl Commands").

ExStyle возвращает 8-значное шестнадцатеричное число, обозначающее расширенный стиль контрола.

Hwnd [v1.0.43.06+] возвращает идентификатор окна (HWND, window handle) указанного контрола. Например:

ControlGet, OutputVar, Hwnd,, Edit1, WinTitle

HWND контрола часто используется с командами PostMessage, SendMessage и DllCall. Узнать его можно также командой MouseGetPos.

ErrorLevel

Нуль, если команда выполнена успешно. Иначе 1.

Примечания

В отличие от команд, которые изменяют контролы, команда ControlGet не делает автоматически паузу после каждого применения, т.е. команда SetControlDelay на неё не действует.

Чтобы выяснить имя контрола под курсором мыши, используйте команду MouseGetPos. Чтобы получить список контролов окна, используйте команду WinGet.

Заголовки и текст окон чувствительны к регистру. Скрытые окна не определяются, если это не задано командой DetectHiddenWindows.

Примеры

ControlGet, OutputVar, Line, 1, Edit1, Some Window Title

ControlGet, WhichTab, Tab, , SysTabControl321, Some Window Title
if ErrorLevel
    MsgBox Ошибка.
else
    MsgBox Вкладка #%WhichTab% сейчас активна.

Перейти на главную страничку сайта (список статей, файлы для скачивания)

© 2007 http://www.script-coding.com При любом использовании материалов сайта обязательна ссылка на него как на источник информации, а также сохранение целостности и авторства материалов.