OneScript - WinExt: Работа с окнами, управление мышкой и клавиатурой

29.11.18

Разработка - OneScript

Цель: Инструмент позволяющий автоматизировать управление окнами, мышкой, посылать нажатия клавиш. Задачи: - Поиск окна по части заголовка - Поиск фрагмента изображения похожего на сохраненный в файле кусок. - Возможность позиционировать курсор, нажимать кнопки мышки. - Возможность посылать нажатия клавиш

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
OneScript - WinExt: Работа с окнами, управление мышкой и клавиатурой:
.zip 629,97Kb
10
10 Скачать (1 SM) Купить за 1 850 руб.

Использовать SikuliX, Selenium не хотелось, слишком громоздко, нужно переучиваться.
В сети, нашел пример поиска части изображения в другом изображении.
Решил добавить функциональность в ВК созданную для проекта SmartConfigurator (WinExt) и опубликовать.

Сначала небольшой пример возможностей ВК.

  • Активировать окно по части заголовка
  • Через меню Операции открыть список документов
  • Создать документ
  • Создать контрагента с наименованием: Контрагент_<ТекущаяДата()>
  • Выбрать контрагента
  • Заполнить ТЧ документа
  • Провести документ
  • Сформировать отчет по остаткам

 

#Использовать WinExt

Перем РаботаСОкнами;
Перем Экран;
Перем Мышь;
Перем Клавиши;

Процедура ПриСозданииОбъекта()
    
    РаботаСОкнами = Новый РаботаСОкнами();
    Мышь = Новый Мышь();
    Экран = Новый Экран();
    Клавиши = Новый МСПослатьКлавиши();

    // Активируем окно по части заголовка (окно не должно быть свернуто)
    РаботаСОкнами.АктивироватьОкноПоЗаголовку("Win ext example ordinary");

    СоздатьПоступлениеТМЦ();
    СформироватьОтчетОстаткиТМЦ();

КонецПроцедуры

Процедура СоздатьПоступлениеТМЦ()

    // меню Операции
    ВыполнитьШаг("img/menu_operations.png");
    Приостановить(1000);
    // Меню Документы
    ВыполнитьШаг("img/menu_documents.png");
    Приостановить(1000);
    // Откроем список Поступлений ТМЦ
    // Для разнообразия нажмем Enter
    Клавиши.ПослатьКлавиши("{ENTER}");
    Приостановить(1000);
    // Нажнем кнопку добавить в списке ПоступлениеТМЦ
    ВыполнитьШаг("img/btn_add.png");
    Приостановить(1000);
    // Найдем подпись контрагенты и кликнем правей, в поле ввода
    ВыполнитьШаг("img/form_title_contragent.png",,100);
    // Откроем окно выбора из списка, создадим контрагента, выберем его
    Клавиши.ПослатьКлавиши("{F4}{INSERT}{TAB}Контрагент_"+ТекущаяДата()+"^({ENTER}){ENTER}");
    // Добавим товар в табличную часть и введем количество, цену, сумму
    Клавиши.ПослатьКлавиши("{TAB}{INSERT}товар1{ENTER}10{ENTER}1{ENTER}10{ENTER}");
    Приостановить(1000);
    // На панели документа нажмем Ок (скрин всей панели, снова делаем сдвиг курсора)
    ВыполнитьШаг("img/panel_doc_buttons.png",,-50);

КонецПроцедуры

Процедура СформироватьОтчетОстаткиТМЦ()

    // меню Операции
    ВыполнитьШаг("img/menu_operations.png");
    Приостановить(1000);
    ВыполнитьШаг("img/menu_reports.png");
    Приостановить(1000);
    Мышь.УстановитьПозициюКурсора(0, 0);
    Приостановить(300);
    ВыполнитьШаг("img/btn_big_ok.png");
    Приостановить(1000);
    ВыполнитьШаг("img/btn_report_run.png");
    Приостановить(1000);
    Мышь.УстановитьПозициюКурсора(0, 0);
    Приостановить(1000);
    ПутьКФрагменту = Новый Файл("img/report_after_receipt.png").ПолноеИмя;
    ФрагментРезультатОтчета = Экран.НайтиФрагмент(ПутьКФрагменту);

    Если ФрагментРезультатОтчета = Неопределено Тогда
        ВызватьИсключение "Ожидаемый фрагмент с результатом отчета не найден.";
    КонецЕсли;

КонецПроцедуры

Процедура ВыполнитьШаг(ИмяФайлаФрагмента, ДвойнойКлик = Ложь, СмещениеЛево = 0, СмещениеВерх = 0)

    ПутьКФрагменту = Новый Файл(ИмяФайлаФрагмента).ПолноеИмя;
    Фрагмент = Экран.НайтиФрагмент(ПутьКФрагменту);

    Если Фрагмент = Неопределено Тогда
        ВызватьИсключение "Не найден фрагмент: " + ИмяФайлаФрагмента;
    КонецЕсли;

    Координаты = КоординатыЦентра(Фрагмент);

    Если ДвойнойКлик Тогда
        Мышь.ЛеваяКнопкаКлик(Координаты.Лево + СмещениеЛево, Координаты.Верх + СмещениеВерх);
        Приостановить(50);
        Мышь.ЛеваяКнопкаКлик(Координаты.Лево + СмещениеЛево, Координаты.Верх + СмещениеВерх);
    Иначе
        Мышь.ЛеваяКнопкаКлик(Координаты.Лево + СмещениеЛево, Координаты.Верх + СмещениеВерх);
    КонецЕсли;

КонецПроцедуры

Функция КоординатыЦентра(Фрагмент)
    
    Лево = Фрагмент.Лево + (Фрагмент.Ширина / 2);
    Верх = Фрагмент.Верх + (Фрагмент.Высота / 2);

    Координаты = Новый Структура();
    Координаты.Вставить("Лево", Лево);
    Координаты.Вставить("Верх", Верх);

    Возврат Координаты;

КонецФункции

Установка

Скачать архив здесь: https://github.com/ret-Phoenix/WinExt/releases

Выполнить команду: `opm install WinExt.ospx`

* Укажите свой путь до файла WinExt.ospx 

Позже будет доступна установка через OneScript OPM без предварительной скачки.

Возможности ВК:

Экран / Sreen

Методы

РазрешениеЭкрана / ScreenResolution()

Получить разрешение экрана

Параметры

  • SreenNumber: Число - Номер экрана, если ничего не задано - берет основной экран

Возвращаемое значение

ФиксированнаяСтруктура (Ширина, Высота)

НайтиФрагмент / FindFragment()

Найти на экране фрагмент из файла

Параметры

  • fragmentFileName: Путь к файлу с искомым фрагментом

Возвращаемое значение

ФрагментЭкрана

ФрагментЭкрана / ScreenFragment

Свойства

Верх / Top

Доступ: Чтение

Лево / Left

Доступ: Чтение

Высота / Height

Доступ: Чтение

Ширина / Width

Доступ: Чтение

РаботаСОкнами / WorkWithWindows

Методы

ЗапомнитьТекущееОкно / GetLinkToCurWindow()

АктивироватьЗапомненноеОкно / WndActivate()

АктивироватьОкноПоЗаголовку / SwitchToWinByTitle()

Мышь / Mouse

Управление мышкой. Установить/Считать позицию. Кликнуть кнопкой.

Методы

ЛеваяКнопкаКлик / LeftMouseClick()

ПраваяКнопкаКлик / RightMouseClick()

СредняяКнопкаКлик / MiddleMouseClick()

УстановитьПозициюКурсора / SetCursorPosition()

Установить позицию курсора

Параметры

  • posX: Позиция X

  • posY: Позиция Y

Возвращаемое значение

Булево - Удалось установить позицию курсора

ПолучитьПозициюКурсора / GetCursorPosition()

Получить позицию курсора

Возвращаемое значение

Структура - Ключи: Верх, Лево

МСПослатьКлавиши / MSSendKeys

Класс для отправки нажатий клавиш, основан на родном .net SendKeys.

Методы

ПослатьКлавиши / SendKeys()

Послать нажатия клавиш. Правила: https://docs.microsoft.com/ru-ru/dotnet/api/system.windows.forms.sendkeys?view=netframework-4.7

Параметры

  • keys: Строка - набор клавиш

ПослатьCtrlG / SendCtrlG()

ПослатьCtrlF / SendCtrlF()

ПослатьCtrlA / SendCtrlA()

ПослатьCtrlO / SendCtrl0()

ПослатьCtrlQ / SendCtrlQ()

ПослатьCtrlT / SendCtrlT()

ПослатьКвадратнуюСкобкуЛевую / SendCtrlSquareBracketLeft()

ПослатьКвадратнуюСкобкуПравую / SendCtrlSquareBracketRight()

ПослатьКонтролИнсерт / SendCtrlInsert()

РаботаСТекстом / WorkWithText

Методы

ПолучитьТекстПоля / GetModuleText()

ЗапомнитьТекущееОкно / GetLinkToCurWindow()

АктивироватьЗапомненноеОкно / WndActivate()

См. также

Работа с интерфейсом OneScript Программист Платформа 1С v8.3 Россия Бесплатно (free)

Графический интерфейс с применением веб-технологий в коллекцию инструментария сценарного языка OneScript. Библиотека создает десктопное приложение имеющее декларативный пользовательский интерфейс (GUI), построенный веб-браузером. Возможности веб-технологий по представлению информации огромны. Эти возможности соответственно добавляются и к сценариям OneScript.

23.01.2025    357    0    ahyahy    4    

8

OneScript Программист Бесплатно (free)

Вместе создадим библиотеку на Oscript с нуля, шаг за шагом: от базовой структуры проекта до перевода на ОСень. Разберем структуру проекта, работу с файлом конфигурации, логирование, уведомления, консольный интерфейс и многое другое. Освоим весь цикл разработки и сделаем первый шаг к созданию собственных инструментов на Oscript!

13.01.2025    2238    leobrn    16    

57

OneScript Программист Платформа 1С v8.3 Бесплатно (free)

Если вы, так же как и я, давно хотели попробовать сделать что-то свое на OneScript, но никак не могли к нему подступиться, то, возможно, эта статья пригодится вам в качестве некоего вводного материала.

10.01.2025    2009    KamranV21    12    

37

OneScript Программист Бесплатно (free)

В мире OneScript давно существуют библиотеки для облегчения работы с каким-либо классом программного обеспечения, например v8runner - помощник выполнения команд конфигуратора или gitrunner - программная обертка для запуска команд git. Есть библиотека и для работы с автономным сервером 1с. Однако библиотеке ibcmdrunner уже три года, а про нее нет ни одной публикации на инфостарте. Исправляю эту несправедливость.

09.01.2025    1323    ardn    0    

22

OneScript Программист Бесплатно (free)

Отгремел Infostart Tech Event 2024, топовое событие в мире 1С-разработки, традиционно проходящее в Санкт-Петербурге. Ваш покорный слуга в этот раз отмечал там 10-летний юбилей проекта OneScript. Отмечание проводилось в форме игры-соревнования по забегу роботов в лабиринте. Участники пытались написать алгоритм движения робота на языке 1С и сделать это быстрее других. О том, как это было – под катом.

28.10.2024    1726    Evil Beaver    11    

25

OneScript Программист Бесплатно (free)

OneScript – это скриптовый движок для автоматизации всего и вся. О том, как OneScript помогает в разработке скриптов на языке 1С, пойдет речь в статье.

10.10.2024    4104    ardn    2    

9

Инструментарий разработчика OneScript Программист Руководитель проекта Бесплатно (free)

Все мы хотя бы раз работали с конструктором запросов. Результатом его работы является синтаксически верный запрос, оформленный по некоторому стандарту. Нравится - не нравится, а привыкаешь быстро, и на запрос, написанный руками, уже не хочется смотреть... А почему бы не попробовать сделать то же самое с исходным кодом 1С? Ну я и попробовал...

23.09.2024    837    0    stopa85    5    

5

Групповая разработка (Git, хранилище) OneScript Программист Платформа 1С v8.3 Бесплатно (free)

Скрипт для работы с SonarQube и локальным репозиторием Git.<br> Цель проекта – возможность выполнить быструю проверку качества кода перед тем, как помещать доработки в рабочее хранилище. В Sonar и Git выгружается не вся конфигурация, а только объекты из заданного списка.<br> https://github.com/vkrivov/go/

02.07.2024    5187    vkrivov@yandex.ru    8    

20
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Vladimir Litvinenko 2904 29.11.18 10:42 Сейчас в теме
Ого, теперь приложения на OneScript, написанные с применением c применением библиотеки GUI можно будет покрывать сценарными тестами ))

А если серьезно, то два вопроса:
- Предполагается ли кросплатформенность с применением mono или хотя бы wine?
- Будет ли на github документация? Хотелось бы более полную документацию чем по https://github.com/ret-Phoenix/oscript-simple-gui, чтобы не приходилось в исходники смотреть для применения ))
15. ret-Phoenix 531 30.11.18 09:37 Сейчас в теме
(1) и часто приходилось лезть в исходник?
Из текущих проблем, знаю только о поиске подчиненного элемента. В остальном, как мне кажется, документация с примерами решают все.
Но я разработчик, мне многое понятно т.к. сам делал, поэтому могу что-то не замечать...
user1316148; +1 Ответить
2. ret-Phoenix 531 29.11.18 10:58 Сейчас в теме
(1)
1. Изначально ВК тестировалась как раз на OneScript GUI (лежит в тестах)
2. Кроссплатформенность - с этим проблемы, поэтому и называется WinExt, т.е. упор на Windows.
Например работа с мышкой и хоткеи - работа через WinAPI, как себя поведет на Wine я не знаю.
Работу под Mono не проверял, по идее класс Экран должен работать, что-то из управления мышкой может получится сделать без WinApi.
3. Документация, на уровне API есть. остальное уже скорее howto.

По тому же GUI громадный фронт работ, по документации так же. Если есть что добавить/подправить - присылайте.

В дальнейшем планируется добавить еще алгоритмы анализа слепков, с возможностью указания какой использовать.
Vladimir Litvinenko; +1 Ответить
3. ret-Phoenix 531 29.11.18 11:25 Сейчас в теме
Кстати, есть возможность использовать плагин из 1С. Например SQL уже так используется. Не помню точно кто это делал, поищу. Как найду - будет 2 статья, но уже по работе из 1С с DLL.
4. Evil Beaver 8263 29.11.18 11:25 Сейчас в теме
5. Makushimo 160 29.11.18 13:35 Сейчас в теме
круто.
а откуда брать координаты для метода ФрагментЭкрана () ?
для тестирования 1С обычные формы еще нельзя использовать?
6. ret-Phoenix 531 29.11.18 13:41 Сейчас в теме
(5)
фрагмент экрана - это что ищем.
см. gif и см код. как раз тестирование обычных форм сделано.
12. Makushimo 160 30.11.18 06:38 Сейчас в теме
(6)то есть координаты фрагмента экрана нужно писать наугад, пока не попадешь? если например у мена нету линейки вертикальной и горизонтальной?
Например в сикули выбираешь область экрана рамкой и она сама координаты фрагмента определяет
13. ret-Phoenix 531 30.11.18 09:24 Сейчас в теме
(12) не понимаю о чем вы вообще пишите.
Читайте API и код.
ФрагментЭкрана - это искомая область, загружаемая из файла. что видно из примеров, документации.
Экран.НайтиФрагмент - ищет на основном экране изображение из ФрагментЭкрана. Если находит вернет структуру с координтами, иначе неопределено. Это видно из примера и документации.
Я ищу не по координатам, а по содержимому. Сикули кстати так же.
16. Makushimo 160 30.11.18 10:52 Сейчас в теме
(13) Закроем эту тему. Видимо мне не удастся донести свой вопрос. Закину в кладовку может найду время разобраться с этим.
пока буду по-старому Сикули использовать.
17. ret-Phoenix 531 30.11.18 11:30 Сейчас в теме
(16) Ваше право, только ФрагментЭкрана лишь возвращает координаты найденного изображения, и принимает только путь с файлом картинки которую нужно найти. Поэтому и не понимаю как писать координаты экрана фрагмента, когда они впринципе не указываются, а возвращаются. В документации и примере это четко видно:

Процедура ВыполнитьШаг(ИмяФайлаФрагмента, ДвойнойКлик = Ложь, СмещениеЛево = 0, СмещениеВерх = 0)

    // ИмяФайлаФрагмента - имя файла с изображением, которое необходимо найти на экране.
    ПутьКФрагменту = Новый Файл(ИмяФайлаФрагмента).ПолноеИмя;
    // ищем изображение из файла на экране
    Фрагмент = Экран.НайтиФрагмент(ПутьКФрагменту);
    // если не нашли - Неопределено
    Если Фрагмент = Неопределено Тогда
        ВызватьИсключение "Не найден фрагмент: " + ИмяФайлаФрагмента;
    КонецЕсли;

    // Нашли, получили класс фрагмент, имеющий ряд свойств, таких как координаты, размеры.
    // Находим координаты центра изображения, для клика, т.к. в моем случае искалась кнопка чтобы кликнуть.
    Координаты = КоординатыЦентра(Фрагмент);
    // какие-то действия

КонецПроцедуры

Функция КоординатыЦентра(Фрагмент)
    
    // Фрагмент.Лево - координаты левого угла по горизонтали
    // Фрагмент.Верх - координаты левого угла по вертикали
    // Фрагмент.Ширина - ширина фрагмента, иначе говоря искомого изображения
    // Фрагмент.Высота - ширина фрагмента, иначе говоря искомого изображения

    Лево = Фрагмент.Лево + (Фрагмент.Ширина / 2);
    Верх = Фрагмент.Верх + (Фрагмент.Высота / 2);

    Координаты = Новый Структура();
    Координаты.Вставить("Лево", Лево);
    Координаты.Вставить("Верх", Верх);

    Возврат Координаты;

КонецФункции
Показать
18. Makushimo 160 30.11.18 14:23 Сейчас в теме
(17) Я, наверное невнимательно смотрел. У вас ФрагментЭкрана - это некий объект со свойствами, который возвращается методом НайтиФрагмент(). А я было подумал, что это метод ФрагментЭкрана(), который аналогично Region() в Сикули, указывает область поиска фрагмента. От этого и возник вопрос.
Ну ОК.
А есть ли у вас метод, который указывает область поиска ? или поиск фрагмента всегда идет по всему экрану?
И как устроен процесс подготовки фрагментов для сценария? Нужно заранее составить библиотеку картинок-скринов элементов интерфейса, например, в Paint ?
19. ret-Phoenix 531 30.11.18 14:37 Сейчас в теме
(18) Метода ограничивающего область поиска нет.
Подготовка фрагментов - нарезка картинок-скринов интерфейса.
Пример из исходников на github
20. Makushimo 160 30.11.18 15:36 Сейчас в теме
7. Tiger77 69 29.11.18 18:54 Сейчас в теме
Было бы неплохо добавить функцию для снятия скриншотов...
14. ret-Phoenix 531 30.11.18 09:28 Сейчас в теме
(7) добавил в задачи, это просто, сделаю в ближайшее время.
8. comol 5114 29.11.18 23:20 Сейчас в теме
Крут крут! И на шарпе наконец то и под оскрипт в исходниках... ещё в ВК обернуть заодно :).

Слушай, а можешь FindSubimage на что-нить другое заменить?

Может заюзаешь https://www.nuget.org/packages/AForge.Vision/ или https://www.nuget.org/packages/OpenCV/ ?

Уже лучше чем сикули работать будет... Точное соответствие это несколько неюзабельно.
Я себе конечно записал в личный бэклог к этой теме вернуться, но чувствую ты быстрее доберёшься...
9. ret-Phoenix 531 30.11.18 00:12 Сейчас в теме
(8) AForge, насколько помню мертв. OpenCV - что-то мелькало по нему, не разбирался.
Точность соответствия пока не регулируется, но это есть в планах.
В будущем хотел разные движки-анализаторы добавлять.
10. comol 5114 30.11.18 00:30 Сейчас в теме
(9) Да, Aforge умер, прочитал :(. Раньше помогал он, в любом случае применение то простое.
Сейчас nuget по CV самый популярный: https://www.nuget.org/packages/Accord.Imaging

Если юзать хотя бы эти движки - с целью скриптов получим лучшее что сейчас есть...
11. ret-Phoenix 531 30.11.18 00:51 Сейчас в теме
(10) еще Magic.Net есть, более известный как ImageMagic
21. 🅵🅾️🆇 524 30.11.18 19:30 Сейчас в теме
22. blackhole321 1314 02.12.18 09:52 Сейчас в теме
Сергей, зайди плз на github, посмотри форк
23. frostrester 07.12.18 07:15 Сейчас в теме
Добрый день. Подскажите, пожалуйста, по каким причинам может быть не найден фрагмент на экране? Есть какие-то условия качества/формата картинки, которую нужно использовать для поиска? Проверила все функции, все работает кроме фрагментов. Может у вас есть какие-то предположения или вы с чем-то подобным сталкивались?
27. Perfolenta 206 18.01.19 13:00 Сейчас в теме
(23) образец лучше всего делать в формате bmp с той же разрядностью цвета как у экрана, т.к. если делать в jpg, то картинка может и не совпадать из-за сжатия...
28. ret-Phoenix 531 18.01.19 16:16 Сейчас в теме
(27) PNG - вполне неплохой вариант.
У меня в тестах он используется.
29. Perfolenta 206 18.01.19 17:04 Сейчас в теме
(28) да, PNG и GIF тоже подходят, они используют сжатие без потерь, но надо следить, что бы палитра в них правильная была выбрана... особенно в GIF...
24. ret-Phoenix 531 07.12.18 10:45 Сейчас в теме
Сталкивался. Когда много шума. Скрины делал в png, программа joxi.
Для начала попробуйте запустить мои тесты. И код точно верный?
25. frostrester 09.12.18 11:35 Сейчас в теме
Да, код верен. Так же делала скрины с помощью joxi. Буду тестировать на других картинках, посмотрю, что получится. Спасибо!
26. ret-Phoenix 531 09.12.18 15:30 Сейчас в теме
(25) Напомню, приложение не должно быть свернутым.
30. premierex 206 20.01.19 12:51 Сейчас в теме
(0)
Поиск окна по части заголовка

А в управляемых формах тоже можно дочернее окно по части заголовка найти?
Я, насколько помню, их там просто нет. Заголовков в смысле. Когда писал компоненту ActiveX контейнер для управляемого интерфейса системы 1С:Предприятие столкнулся с этой проблемой.
31. D_e_X_T_e_R 575 11.08.21 15:45 Сейчас в теме
Доброго времени.
Сделал все по примеру в публикации. Картинка png, обычные формы, но клик уходит мимо изображения, учитывая, что смещение по 0. Почему так может происходить?
Оставьте свое сообщение