На чем удобней сделать такую задачу?

Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті

Всем здраствуйте!

Попрограммировал раньше я немало. В основном для БД и не сложные Java приложения.

На работе сейчас по-програмировать не получается, поэтому хочу некую гимнастику для ума:).

Сейчас меня заинтересовала в качестве хобби одна задача и я хочу попробывать ее автоматизировать и сделать это на наиболее подходящем и новом для меня языке. Использовать буду google=driven development;)

А вопрос следующий: На чем лучше подойти к такой части функционала:

Есть некая программа (я так полагаю на MS Visual C++ по косвенным признакам). Она выводит в окно различную информацию о состояниях своих процессов. Там есть кнопки, поля ввода/вывода текста и стандартные местя для изображений состояний.Но насколько я понимаю все контролы не «стандартные виндовые», т.к. поля ввода и кнопки не табаются, в буффер не хватается текст и т.п.

Как нажимать кнопки из своей программы в чужой я раньше и на дельфи умел, так что мне кжется любой язык умеющий вызывать WinAPI функцию здесь подойдет.

Вопрос в том как оперативно (раз в 2–3 секунды) захватывать рабочую область экрана, анализирвать были-ли изменения, если были пытаться найти какие показатели изменились, распознать измененую графическую область и передать код изменения дальше в логическую часть.

Как я сейчас вижу (если решать задачу «в лоб»), мне поможет Visual С++ (нашел версию 2007). Делать в нем capture окна приложения, разбить изображение на значимые секции, проанализировать попиксельно измененные секции. Для управления разработать perpetum mobile на теории автоматов. А смущает меня следущие моменты:

1. хватит ли производительности ПК для постоянного компаратора изображений, сможет ли программа брать несколько экземпляров в работу.

2. сможет ли программа работать в бэкграунде (обязательно-ли нужен ли фокус для схватки изображения, отправки события mouse-click (X, Y))

Вообщем, кому не лениво, поделитесь просто мыслями или хинтами:) Имя функции для быстрого grabber-a, image compator-a будет достаточно.

Спасибо!

👍ПодобаєтьсяСподобалось0
До обраногоВ обраному0
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Задача, описанная топикстартером очень мне напомнила задачу, которую недавно решал.
А именно, нужно было сканить и распознавать изменение инфы с покерного окна (PokerStars) тоже несколько раз в секунду.

Делал полностью на Джаве — окно скринил с помощью AWT Robot. Работало все довольно шустро: для 30-ти столов скрининг + распознавание занимало около 0.2 секунд вроде.

Проскакивала недавно странная загогулина, возможно, для данной задачи подойдет.

Sikuli — program ANYTHING using GUI screenshoots

Спасибо всем за комментарии. Прочитал ссылку.
Действительно, на написание такой программы меня подтолкнуло описание одной из систем авт. тестирования. Но те ограничения что я увидел в описании мне не подходят.
Мне нужно чтобы система субъект-объект могла работать в бэкграунде. Если пилотная версия получится, хочется иметь возможность запускать несколько экземляров системы.
Да, состояния нужно распозновать. Их конечное количество, я думаю в конечно итоге свести к анализу карты ключевых пикселей (а не всего битмапа). Но есть момент, могут появлятся произвольные числовые значения в опр. местах окна. Тут надо будет наверное распозновать посимвольно. Чем больше думаю, тем больше видится трудоемких проблем:)
Спай++ попробую, но мне кажется что реальность — это анализ битмапов.
Примером объекта может быть игра Pinball из поставки винды. Мне не надо ловить перемещения шарика или рукояток, но собрать стаистику «мигания лампочек» — похоже на мою задачу.
Сейчас важный вопрос, можно ли выдрать битмап снимок окна программы работающей в бекграунде?
Можно ли послать мышиный евент проге в бекграунд?

Или как вариант, засунуть его в виртуальную машину.

пробуй фришный Autoit
www.autoitscript.com/...it3/index.shtml

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

Шото мне описание задачи напомнило перечисление фич системы автоматизированного тестирования. Вот и думаю:, а может какая-то из этих систем подойдет?
Они уже по дефолту умеют захвавтывать изображения с экрана, сравнивать с шаблонами и вызывать некий код при необходимости.
Плюс многие из них имеют встроенный язык программирования (либо свой собственный, либо что-то наподобие VB) на котором можно запрограммировать действия которые необходимо выполнять в случае если текущее изображение не совпадет с шаблонным.
Да и контролы они различать вроде как умеют (по крайней мере текстбокс от кнопки уже точно отличат), и текст который в этих контролах парсить умеют.
Правда вот в бекграунде работать они не умеют, так как им надо уже открытое окно приложение, а оно само там мышку двигает и нужные кнопки нажимает.

Хотя думаю если свой велосипед сочинять так это все равно в бекграунде не получится: надо же откуда-то будет брать то изображение которое сейчас на экране

А почему бы просто не брать значение TextBox-a? o_O

Ясно, читал невнимательно, сорри.

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

1. А зачем анализировать все? По хорошему хватит нескольких ключевых точек.

Я и делал по областям. Сравнивал только те области, которые обазначивал пользователь, а не весь экран.

1. А зачем анализировать все? По хорошему хватит нескольких ключевых точек.

2. Насколько помню — фокус необязателен.

www.codeproject.com/...eyboardlib.aspx

А по поводу

захватывать рабочую область экрана, анализирвать были-ли изменения

:
Я делал PrintScreen экрана и птм при запуске скрипта сравнивал текущий PrintScreen с тем, что делался перед записью скрипта.
Это я делал так, так как мне надо было знать, что расположение элементов идентично тому, которое было при записи скрипта.

Если тебе необходимо знать, что поле ввода или же какая-либо кнопка ВООБЩЕ существует/отображается где-либо на экране (не важно в каком месте экрана), то мой способ тебе не подходит: -)

2 Chiz_

о, мені може пригодиться! Якщо можеш дати посилання — давай!:)

посмотри spy++ ом на это самое окно, сразу станет понятно насколько эти все контролы «стандартные виндовые», ИМХО скорее всего такие стандартные что стандартрей прям некуда, какой псих будет нестандартные рисовать при наличии стандартных? Если стандартные то всё просто, и никаких capture окна приложения «в лоб» (нихера себе в лоб) делать не прийдётся

Я писал прогу, кот саписывает действия пользователя (нажатия клавиш клавиатуры мыши и перемещение мыши). Такие записанные действия складировались в скрипты и перед каждым запуском скрипта проверялась (ись) область (и) экрана на предмет совпадения. Если текущее состояние экрана было идентично тому, что было в момент записи скрипта, то скрипт выполнялся, иначе писался, что провален и переходил к следующему.

Использовался C#, в котором вызывались методы WinAPI. Если это подходит, то я вечером покавыряюсь и дам сцылку, где я отрывал это. Или объясню, что я делал для достижения определенных результатов.

Підписатись на коментарі