-
Notifications
You must be signed in to change notification settings - Fork 14
Home
Предназначена для управления окнами Windows и Linux, разработана по технологии Native API.
- Получение списка окон и списка процессов
- Управление размерами и положением окна
- Получение снимка окна и снимка экрана
- Доступ к данным буфера обмена
- СвойстваЭкрана (ScreenInfo)
- СписокДисплеев (DisplayList)
- СписокОкон (WindowList)
- ИдентификаторПроцесса (ProcessId)
- АктивноеОкно (ActiveWindow)
- ТекстБуфераОбмена (ClipboardText)
- КартинкаБуфераОбмена (ClipboardImage)
- ПозицияКурсора (CursorPos)
Работа с процессами:
- НайтиКлиентТестирования (FindTestClient)
- ПолучитьСписокПроцессов (GetProcessList)
- ПолучитьСвойстваПроцесса (GetProcessInfo)
- ВебСокет (WebSocket)
- Пауза (Sleep)
Информация об окружении:
Управление окном приложения:
- ПолучитьСписокОкон (GetWindowList)
- ПолучитьСвойстваОкна (GetWindowInfo)
- ПолучитьРазмерОкна (GetWindowSize)
- УстановитьРазмерОкна (SetWindowSize)
- УстановитьПозициюОкна (SetWindowPos)
- АктивироватьОкно (ActivateWindow)
- РаспахнутьОкно (MaximixeWindow)
- РазвернутьОкно (RestoreWindow)
- СвернутьОкно (MinimizeWindow)
Захват изображения экрана:
- ПолучитьСнимокЭкрана (TakeScreenshot)
- ПолучитьСнимокОкна (CaptureWindow)
- ПолучитьСнимокПроцесса (CaptureProcess)
Работа с буфером обмена:
Расширенный функционал работы с буфером обмена вынесен в объект ClipboardControl.
Внешняя компонента поддерживает как синхронный, так и асинхронный вызов. Для асинхронного вызова в полном соответствии с документацией Синтакс-помощника 1С:Предприятие применяются методы:
- НачатьВызов<ИмяМетода>(<ОписаниеОповещения>, <Параметры>)
- НачатьПолучение<ИмяСвойства>(<ОписаниеОповещения>)
Пример асинхронного вызова внешней компоненты:
&НаКлиенте
Процедура ПодключениеВнешнейКомпонентыЗавершение(Подключение, ДополнительныеПараметры) Экспорт
ОписаниеОповещения = Новый ОписаниеОповещения("ПолученаВерсияКомпоненты", ЭтотОбъект);
ВнешняяКомпонента.НачатьПолучениеВерсия(ОписаниеОповещения);
КонецПроцедуры
&НаКлиенте
Процедура ПолученаВерсияКомпоненты(Значение, ДополнительныеПараметры) Экспорт
Заголовок = "Управление окнами, версия " + Значение;
КонецПроцедуры
Далее по тексту все примеры будут приводиться для синхронных вызовов. В публикуемом примере 1cWinCtrl.epf используются только асинхронные вызовы.
Многие свойства и методы компоненты возвращают сложные типы данных, которые сериализованы в строку формата JSON. Поэтому имеет смысл объявить в вызывающем модуле универсальную функцию, которая будет использоваться ниже в примерах работы компоненты:
Функция ПрочитатьСтрокуJSON(ТекстJSON)
Если ПустаяСтрока(ТекстJSON) Тогда
Возврат Неопределено;
Иначе
ПоляДаты = Новый Массив;
ПоляДаты.Добавить("CreationDate");
ЧтениеJSON = Новый ЧтениеJSON();
ЧтениеJSON.УстановитьСтроку(ТекстJSON);
Возврат ПрочитатьJSON(ЧтениеJSON, , ПоляДаты);
КонецЕсли;
КонецФункции
Готовая сборка внешней компоненты находится в файле /Example/Templates/_1cWinCtrl/Ext/Template.bin
Порядок самостоятельной сборки внешней компоненты из исходников:
- Для сборки компоненты необходимо установить Visual Studio Community 2019
- Скачиваем и устанавливаем библиотеку boost
- Чтобы работала сборка примера обработки EPF надо установить OneScript версии 1.0.20 или выше
- Устанавливаем VirtualBox и разворачиваем в минимальной конфигурации Ubuntu 18.04 или CentOS 8
- Устанавливаем на Linux необходимые пакеты (см. ниже) и дополнения гостевой ОС
- Подключаем в VirtualBox общую папку с исходными текстами внешней компоненты
- В среде Linux для компиляции библиотек запустить ./build.sh
- В среде Window для завершения сборки запустить ./compile.bat
Сборка для Linux в CentOS 8:
yum -y group install "Development Tools"
yum -y install cmake glibc-devel.i686 glibc-devel libuuid-devel
yum -y install libstdc++-devel.i686 gtk2-devel.i686 glib2-devel.i686
yum -y install libstdc++-devel.x86_64 gtk2-devel.x86_64 glib2-devel.x86_64
git clone https://github.com/lintest/1cWinCtrl.git
cd 1cWinCtrl
./build.sh
Сборка для Linux в Ubuntu 18.04:
sudo apt update
sudo apt install -y build-essential cmake git
sudo apt install -y gcc-multilib g++-multilib
sudo apt install -y uuid-dev libx11-dev libxrandr-dev libpng-dev
git clone https://github.com/lintest/1cWinCtrl.git
cd 1cWinCtrl
./build.sh
Сборка библотеки boost для Windows
b2.exe toolset=msvc link=static threading=multi runtime-link=static release stage
Установка на VirtualBox дополнений гостевой ОС для Linux:
mkdir -p /media/cdrom
mount -r /dev/cdrom /media/cdrom
cd /media/cdrom
./VBoxLinuxAdditions.run
sudo usermod -a -G vboxsf "$USER"
reboot
Для создания объекта экземпляра внешней компоненты используйте имя WindowsControl. В прилагаемом примере файлы внешней компоненты хранятся в макете _1cWinCtrl, реквизит формы МестоположениеКомпоненты используется для передачи макета компоненты между сервером и клиентом. Для установки и подключения внешней компоненты рекомендуется использовать следующий программный код:
&НаКлиенте
Перем ИдентификаторКомпоненты, ВнешняяКомпонента;
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
МакетКомпоненты = РеквизитФормыВЗначение("Объект").ПолучитьМакет("_1cWinCtrl");
МестоположениеКомпоненты = ПоместитьВоВременноеХранилище(МакетКомпоненты, УникальныйИдентификатор);
КонецПроцедуры
&НаКлиенте
Процедура ПриОткрытии(Отказ)
ИдентификаторКомпоненты = "_" + СтрЗаменить(Новый УникальныйИдентификатор, "-", "");
ВыполнитьПодключениеВнешнейКомпоненты(Истина);
КонецПроцедуры
&НаКлиенте
Процедура ВыполнитьПодключениеВнешнейКомпоненты(ДополнительныеПараметры) Экспорт
ОписаниеОповещения = Новый ОписаниеОповещения("ПодключениеВнешнейКомпонентыЗавершение", ЭтаФорма, ДополнительныеПараметры);
НачатьПодключениеВнешнейКомпоненты(ОписаниеОповещения, МестоположениеКомпоненты, ИдентификаторКомпоненты, ТипВнешнейКомпоненты.Native);
КонецПроцедуры
&НаКлиенте
Процедура ПодключениеВнешнейКомпонентыЗавершение(Подключение, ДополнительныеПараметры) Экспорт
Если Подключение Тогда
ВнешняяКомпонента = Новый("AddIn." + ИдентификаторКомпоненты + ".WindowsControl");
ИначеЕсли ДополнительныеПараметры = Истина Тогда
ОписаниеОповещения = Новый ОписаниеОповещения("ВыполнитьПодключениеВнешнейКомпоненты", ЭтаФорма, Ложь);
НачатьУстановкуВнешнейКомпоненты(ОписаниеОповещения, МестоположениеКомпоненты);
КонецЕсли;
КонецПроцедуры
Тип значения: Строка (только чтение)
- Возвращает строку с текстом в формате JSON, при чтении которого получаем объект типа Структура с размерами экрана и рабочей области.
Тип значения: Строка (только чтение)
- Возвращает строку с текстом в формате JSON, при чтении которого получаем объект типа Массив из элементов типа Структура с размерами дисплеев мониторов.
Тип значения: Строка (только чтение)
- Возвращает строку с текстом в формате JSON, при чтении которого получаем объект типа Массив из элементов типа Структура с информацией об окнах верхнего уровня: дескриптор окна, диентификатор процесса, владелец, заголовок окна.
Тип значения: Целое число (только чтение)
- Возвращает идентификатор основного процесса приложения 1С, в сеансе которого вызывается внешняя компонента.
Тип значения: Целое число (чтение и запись)
- Дескриптор приоритетного окна (окна, с которым пользователь в настоящее время работает).
Тип значения: Строка (чтение и запись)
- Предоставляет доступ к содержимому буфера обмена в текстовом формате.
Тип значения: Двоичные данные (чтение и запись)
- Предоставляет доступ к содержимому буфера обмена в формате картинки PNG.
ПотокВПамяти = Новый ПотокВПамяти;
БиблиотекаКартинок.ДиалогИнформация.Записать(ПотокВПамяти);
ДвоичныеДанные = ПотокВПамяти.ЗакрытьИПолучитьДвоичныеДанные();
ВнешняяКомпонента.КартинкаБуфераОбмена = ДвоичныеДанные;
Возвращает текст в формате JSON, при чтении которого получаем объект типа Структура, сотдержащий информацию о клиенте тестирования, найденному по номеру порта, который присутствует в командной строке экземпляра клиента тестирования.
Параметры функции:
- НомерПорта (обязательный), Тип: Целое число
Тип возвращаемого значения: Строка
- Содержит строку с текстом в формате JSON, при чтении которого получаем
объект типа Структура с подробной информацией о найденном процессе.
- ProcessId - идентификатор процесса (Число)
- CommandLine - командная строка процесса (Строка)
- CreationDate - дата старта процесса (Дата)
- Window - дескриптор основного окна (Число)
- Title - заголовок основного окна (Строка)
ТекстJSON = ВнешняяКомпонента.НайтиКлиентТестирования(ПортПодключения);
СтруктураСвойствПроцесса = ПрочитатьСтрокуJSON(ТекстJSON);
Если СтруктураСвойствПроцесса <> Неопределено Тогда
ИдентификаторПроцесса = СтруктураСвойствПроцесса.ProcessId;
ДескрипторОкна = СтруктураСвойствПроцесса.Window;
КонецЕсли;
Получает список запущенных процессов с возможностью отбора только процессов 1С. Отбор производится по наименованию исполняемого файла на соответствие маске "1cv8*".
Параметры функции:
- ИспользоватьОтбор (обязательный), Тип: Булево
Тип возвращаемого значения: Строка
- Содержит строку с текстом в формате JSON, при чтении которого получаем типа Массив из элементов типа Структура информацией о процессах.
ТекстJSON = ВнешняяКомпонента.ПолучитьСписокПроцессов(Истина);
Для каждого Стр из ПрочитатьСтрокуJSON(ТекстJSON) Цикл
НоваяСтр = СписокПроцессов.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтр, Стр);
КонецЦикла;
По идентификатору процесса возвращает всю доступную информацию о процессе.
Параметры функции:
- ИдентификаторПроцесса (обязательный), Тип: Целое число
Тип возвращаемого значения: Строка
- Содержит строку с текстом в формате JSON, при чтении которого получаем
объект типа Структура с подробной информацией о процессе:
- ProcessId - идентификатор процесса (Число)
- CommandLine - командная строка процесса (Строка)
- CreationDate - дата старта процесса (Дата)
ТекстJSON = ВнешняяКомпонента.ПолучитьСвойстваПроцесса(ИдентификаторПроцесса);
СтруктураСвойстваПроцесса = ПрочитатьСтрокуJSON(ТекстJSON);
Простейшая функция обмена данными по протоколу WebSocket. Может быть использована для интеграции с браузером Google Chrome.
Параметры функции:
- Адрес (обязательный), Тип: Строка
- Команда (обязательный), Тип: Строка
Тип возвращаемого значения: Строка
- Содержит данные, полученные как ответ сервера WebSocket на отправленную команду.
АдресВебСокет = "ws://localhost:9222/devtools/page/771BF9AF6EE6F712337EF74397960652";
КомандаJSON = "{""id"":1,""method"":""Page.captureScreenshot"",""params"":{""format"":""png""}";
ТекстJSON = ВнешняяКомпонента.ВебСокет(АдресВебСокет, КомандаJSON);
ДанныеJSON = ПрочитатьСтрокуJSON(ТекстJSON);
ДвоичныеДанные = Base64Значение(ДанныеJSON.result.data);
Подробная информация о Chrome DevTools Protocol доступна по адресу:
Приостанавливает выполнение программного кода на заданное количество миллисекунд.
ВнешняяКомпонента.Пауза(1000);
По дескриптору окна получает список дисплеев, на которых располагается окно или его части.
Параметры функции:
- ДескрипторОкна (необязательный), Тип: Целое число Если параметр не задан, будет получена информация обо всех дисплеях.
Тип возвращаемого значения: Строка
- Содержит строку с текстом в формате JSON, при чтении которого получаем объект типа Массив из элементов типа Структура со свойствами дисплея: координаты границ, высота и ширина, наименование дисплея, координаты и размер рабочей области дисплея.
ТекстJSON = ВнешняяКомпонента.ПолучитьСписокДисплеев(ДескрипторОкна);
Для каждого ЭлементМассива из ПрочитатьСтрокуJSON(ТекстJSON) Цикл
ЗаполнитьЗначенияСвойств(СписокДисплеев.Добавить(), ЭлементМассива);
КонецЦикла;
По дескриптору окна получает свойства дисплея, на котором располагается наибольшая часть окна.
Параметры функции:
- ДескрипторОкна (необязательный), Тип: Целое число Если параметр не задан, будет получена информация для активного окна.
Тип возвращаемого значения: Строка
- Содержит строку с текстом в формате JSON, при чтении которого получаем объект типа Структура со свойствами дисплея: координаты границ, высота и ширина, наименование дисплея, координаты и размер рабочей области дисплея.
ТекстJSON = ВнешняяКомпонента.ПолучитьСвойстваДисплея(ДескрипторОкна);
СвойстваДисплея = ПрочитатьСтрокуJSON(ТекстJSON);
ВнешняяКомпонента.УстановитьПозициюОкна(ДескрипторОкна, СвойстваДисплея.Left, СвойстваДисплея.Top);
Возвращает текст в формате JSON, при чтении которого получаем объект типа Массив из элементов типа Структура с информацией об окнах, принадлежащих указанному процессу.
Параметры функции:
-
ИдентификаторПроцесса (обязательный), Тип: Целое число
- Если параметр нулевой или не задан, возвращается список всех окон.
Тип возвращаемого значения: Строка
- Содержит строку с текстом в формате JSON, при чтении которого получаем объект
типа Массив из элементов типа Структура с информацией о найденых окнах:
- Window - дескриптор окна (Число)
- ProcessId - идентификатор процесса (Число)
- Class - идентификатор класса окна (Строка)
- Title - заголовок окна (Строка)
- Owner - окно владелец (Число)
ТекстJSON = ВнешняяКомпонента.ПолучитьСписокОкон(ИдентификаторПроцесса);
МассивОкон = ПрочитатьСтрокуJSON(ТекстJSON);
ТаблицаОкон.Очистить();
Для каждого Стр из МассивОкон Цикл
ЗаполнитьЗначенияСвойств(ТаблицаОкон.Добавить(), Стр);
КонецЦикла;
Возвращает текст в формате JSON, при чтении которого получаем объект типа Структура с информацией об основных свойставх окна:
Параметры функции:
-
ДескрипторОкна (обязательный), Тип: Целое число
- Если параметр нулевой, будут получены свойства активного окна.
Тип возвращаемого значения: Строка
- Содержит строку с текстом в формате JSON, при чтении которого получаем объект
типа Структура с информацией об основных свойствах окна:
- Window - дескриптор окна (Число)
- ProcessId - идентификатор процесса (Число)
- Maximized - распахнуто, максимизировано (Булево)
- Class - идентификатор класса окна (Строка)
- Title - заголовок окна (Строка)
- Owner - окно владелец (Число)
ТекстJSON = ВнешняяКомпонента.ПолучитьСписокОкон(ИдентификаторПроцесса);
СвойстваОкна = ПрочитатьСтрокуJSON(ТекстJSON);
ЗаголовокОкна = СвойстваОкна.Title;
Возвращает текст в формате JSON, при чтении которого получаем объект объект типа Структура с информацией о размерах и позиции окна.
Параметры функции:
-
ДескрипторОкна (обязательный), Тип: Целое число
- Если параметр нулевой, будут получены размеры активного окна.
Тип возвращаемого значения: Строка
- Содержит строку с текстом в формате JSON, при чтении которого получаем объект
типа Структура с информацией о размерах и позиции окна:
- Left - левая граница (Число)
- Top - верхняя граница (Число)
- Right - правая граница (Строка)
- Bottom - нижняя граница (Строка)
- Width - ширина окна (Число)
- Height - высота высота (Число)
- Window - дескриптор окна (Число)
Активирует окно по дескриптору.
Параметры функции:
- ДескрипторОкна (обязательный), Тип: Целое число
ВнешняяКомпонента.АктивироватьОкно(ДескрипторОкна);
Распахиват (максимизирует) окно, разворачивая его на всё рабочую область экрана.
Параметры функции:
- ДескрипторОкна (обязательный), Тип: Целое число
ВнешняяКомпонента.РаспахнутьОкно(ДескрипторОкна);
Показывает окно в нормальном режиме отображения, если оно было свёрнуто или распахнуто.
Параметры функции:
- ДескрипторОкна (обязательный), Тип: Целое число
ВнешняяКомпонента.РазвернутьОкно(ДескрипторОкна);
Перемещает позицию курсора (мышки) в указанную точку экрана.
Получает снимок экрана или активного окна, в зависимости от переданного параметра.
Параметры функции:
-
Режим (обязательный), Тип: Целое число
- 0 - Чтобы сделать снимок всего экрана
- 1 - Чтобы сделать снимок области активного окна
Тип возвращаемого значения: Двоичные данные
- Возвращает картинку в формате PNG.
ДвоичныеДанные = ВнешняяКомпонента.ПолучитьСнимокЭкрана(0);
Получает снимок произвольного окна по его дескриптору.
Параметры функции:
-
ДескрипторОкна (обязательный), Тип: Целое число
- 0 - Чтобы сделать снимок активного окна
Тип возвращаемого значения: Двоичные данные
- Возвращает картинку в формате PNG.
ДвоичныеДанные = ВнешняяКомпонента.ПолучитьСнимокОкна(ДескрипторОкна);
Получает снимок верхнего окна экземпляра 1С:Предприятие по идентификатору процесса.
Параметры функции:
-
ИдентификаторПроцесса (обязательный), Тип: Целое число
- Идентификатор процесса приложения 1С:Предприятие
Тип возвращаемого значения: Двоичные данные
- Возвращает картинку в формате PNG.
ДвоичныеДанные = ВнешняяКомпонента.ПолучитьСнимокПроцесса(ИдентификаторПроцесса);
Очищает буфер обмена.
ВнешняяКомпонента.ОчиститьБуферОбмена();
Внешняя компонента содержит также отдельный класс для работы с буфером обмена. Для создания объекта доступа к буферу обмена используйте имя ClipboardControl.
&НаКлиенте
Перем БуферОбмена;
&НаКлиенте
Процедура ПодключениеВнешнейКомпонентыЗавершение(Подключение, ДополнительныеПараметры) Экспорт
БуферОбмена = Новый("AddIn." + ИдентификаторКомпоненты + ".ClipboardControl");
КонецПроцедуры
- Текст / Text
- Картинка / Image
- Файлы / Files
- Формат / Format
- Версия / Version
- ЗаписатьТекст / SetText
- ЗаписатьФайлы / SetFiles
- ЗаписатьКартинку / SetImage
- Очистить / Empty
При разработке использовались библиотеки: