Форум программистов, компьютерный форум, киберфорум
Lazarus
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
 Аватар для alicesmagic
233 / 130 / 27
Регистрация: 24.08.2016
Сообщений: 875

Как распознавать текст из работающей Windows-программы?

04.03.2018, 18:48. Показов 2286. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Очень прошу помочь советом!
Есть программа, которая выдает вот такие данные с интервалом в пару секунд:


Необходимо в режиме реального времени сканировать окно программы и, при выполнении некоторых условий, выполнять некоторые действия с этими данными.
Программу, обрабатывающую эти данные я уже написала, но приходится постоянно скриншотить и, затем, получать данные со скриншотов вручную. Адский труд! Можно ли как-то усовершенствовать мою программу, чтобы она сама снимала данные и потом уже выполняла то, что уже умеет?
Причем, важны не только числовая и символьная информация, но также и цвет текста и цвет фона, которые тоже нужно сканировать и учитывать в расчетах. Плюс название в шапке окна тоже меняется время от времени и его тоже нужно сканировать и учитывать.
Задачу облегчает то, что данные все время находятся на одном и том же месте. Меняется только содержимое. Можно было бы привязать координатные рамки, распознающие текст и цвет, для каждой надписи к левому-верхнему (например) углу окна.
Я не знаю, возможно ли такое вообще соорудить. Очень прошу подсказать с чего начать и в каком направлении двигаться. Может быть есть уже готовые компоненты способные распознавать текст и цвет с экрана монитора компьютера?
Миниатюры
Как распознавать текст из работающей Windows-программы?  
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.03.2018, 18:48
Ответы с готовыми решениями:

Создание портативной программы, работающей с WPF и Windows Forms
WPF, WindowsFormAplication Создание портативной программы Народ подкинте хороший вариант создание портативной программы например...

Как добраться до апликейшана работающей программы 1С
Добрый день. Задача: Необходимо в уже запущенной программе 1С открыть форму. Работать все должно через консольную программу....

Как сделать выход из цикла работающей программы ?
Здравствуйте - всем. Вопрос такой. Сделал программу и она из большого массива строк выбирает нужные строки и складывает их в отдельный...

20
 Аватар для alicesmagic
233 / 130 / 27
Регистрация: 24.08.2016
Сообщений: 875
05.03.2018, 01:34  [ТС]
Подскажите хотя-бы, возможно ли такое вообще сделать?

____________
Видео почему-то не работает. Хотя по ссылке без проблем открывается.
0
 Аватар для vlisp
1064 / 985 / 153
Регистрация: 10.08.2015
Сообщений: 5,374
05.03.2018, 01:38
Лучший ответ Сообщение было отмечено alicesmagic3d как решение

Решение

попробуй GetPixel из winapi. правда она тормознутая
1
 Аватар для alicesmagic
233 / 130 / 27
Регистрация: 24.08.2016
Сообщений: 875
05.03.2018, 02:59  [ТС]
Спасибо! Направление ясно. Подскажите уж заодно и толковую книжку по winapi, пожалуйста.
В литературном топике ничего не нашла.
0
Джоуи
 Аватар для Joey
1083 / 645 / 240
Регистрация: 05.05.2015
Сообщений: 3,559
Записей в блоге: 2
06.03.2018, 01:50
Лучший ответ Сообщение было отмечено alicesmagic3d как решение

Решение

Ну толковее чем MSDN Вы вряд ли найдете https://msdn.microsoft.com/en-... 85%29.aspx
Если инглиш хромает вот довольно обширный каталог переведенных статей http://vsokovikov.narod.ru/New... x_msdn.htm
И мой любимый справочник по WinAPI (правда не скрупулезный, не доскональный, но если та или иная функция не до конца понятна, дается еще куча похожих или взаимосвязанных ссылок, да и объединение в категории хорошо) Первые шаги

Но все равно WinAPI всегда будет сложной темой для новичка, учтите.

Не по теме:

It's dangerous to go alone, take this...

1
Фрилансер
 Аватар для Black Fregat
3709 / 2083 / 567
Регистрация: 31.05.2009
Сообщений: 6,683
06.03.2018, 02:25
Может быть, проще разобраться, откуда эти данные берутся?
1
 Аватар для alicesmagic
233 / 130 / 27
Регистрация: 24.08.2016
Сообщений: 875
06.03.2018, 02:53  [ТС]
Цитата Сообщение от Joey Посмотреть сообщение
...
Но все равно WinAPI всегда будет сложной темой для новичка, учтите.
Спасибо большое! Буду разбираться. Тема сложная, это я уже поняла. Ну, чтож... Надеюсь, что осилю)))

Black Fregat, а как разобраться откуда? Взламывать программу? Это уже совсем другая тема и лезть в нее не интересно. А так может хоть программировать научусь)
0
Фрилансер
 Аватар для Black Fregat
3709 / 2083 / 567
Регистрация: 31.05.2009
Сообщений: 6,683
06.03.2018, 07:40
Цитата Сообщение от alicesmagic3d Посмотреть сообщение
как разобраться откуда? Взламывать программу?
Это от программы зависит. Если, например, данные из интернета, проще свой запрос сделать.
Слишком мало данных..
1
 Аватар для alicesmagic
233 / 130 / 27
Регистрация: 24.08.2016
Сообщений: 875
06.03.2018, 13:29  [ТС]
Цитата Сообщение от Black Fregat Посмотреть сообщение
Если, например, данные из интернета, проще свой запрос сделать.
Точно не из интернета. Программа взаимодействует с локальной базой данных, к которой у меня допуска нет. Мне разрешили лишь пользоваться программой, и на том спасибо.
Долго объяснять... да и не стоит оно того.
Почитала про винапи, выяснила, что проще его изучать из С++. Так что Лазарус пока откладывается в сторону. Всем спасибо за помощь!
0
 Аватар для vlisp
1064 / 985 / 153
Регистрация: 10.08.2015
Сообщений: 5,374
06.03.2018, 13:51
Цитата Сообщение от alicesmagic3d Посмотреть сообщение
Почитала про винапи, выяснила, что проще его изучать из С++. Так что Лазарус пока откладывается в сторону. Всем спасибо за помощь!
разницы в том, что изучать нет, от слова вообще, хоть паскаль, хоть срр, ассемблер
1
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33395 / 21505 / 8236
Регистрация: 22.10.2011
Сообщений: 36,902
Записей в блоге: 12
06.03.2018, 14:22
Цитата Сообщение от alicesmagic3d Посмотреть сообщение
выяснила, что проще его изучать из С++
Проще всего его вообще не изучать. Это действительно самый простой вариант. А уж если изучать - то и с использованием С++ (кстати, почему С++, если WinAPI - это чистый Си?) и с использованием Паскаля/Дельфи/Ассемблера/Фортрана/Кобола - все равно придется прикладывать значительные усилия. Причем далеко не всегда усилия затраченные для написания приложения на Паскале будут больше, чем для написания того же функционала на Си.
2
 Аватар для alicesmagic
233 / 130 / 27
Регистрация: 24.08.2016
Сообщений: 875
06.03.2018, 22:18  [ТС]
Цитата Сообщение от volvo Посмотреть сообщение
Проще всего его вообще не изучать. Это действительно самый простой вариант.
Согласна. Не изучать проще. Только этот вариант мне не подходит. И я не вижу ничего плохого в том, чтобы найти более легкий путь в поиске решения задачи. Удивляет только сарказм, исходящий от опытного программиста, по поводу целесообразности поиска более простого решения.
Начнем с того, что систематизированной информации по винапи в интернете не так уж и много и практически вся она (по крайней мере так заявляют авторы публикаций) требует хотя бы минимальных знаний по С++. И чего плохого в том, если я, (рискну показаться нескромной) освоив азы Делфи и Лазаруса, дополнительно освою уж и азы С++, прежде чем возьмусь за изучение ВинАпи?
По крайней мере, только начав рыться в материалах, которые я нашла по ВинАпи самостоятельно, и в материалах, которые мне любезно предоставил Joey, я сразу же уткнулась в совершенно незнакомый мне синтаксис. И что прикажете с этим делать?

"...Так как "официальные" справка и примеры работы с API предполагают работу на С или C++, и это может вызвать трудности у человека, знакомого только с Delphi..."
"...Авторы книг по Delphi стараются как можно быстрее перейти к описанию возможностей различных библиотек, оставляя в стороне другие важные вопросы.
""За бортом" остается множество тем, касающихся более низкоуровневых средств, которые в большинстве своем неплохо документированы и описаны в книгах, проиллюстрированы готовыми примерами, которые, правда, обычно даются на C++. Конечно, немного опыта — и код переведен с C++ на Delphi..."

А.Б.Григорьев "О чем не пишут в книгах по Delphi"


Заметили? "Конечно, немного опыта — и код переведен с C++ на Delphi..." Вот как раз опыта знакомства с С++ у меня пока нет. И при этом Лазарус, это даже не совсем Делфи, так что я не знаю какие подводные камни таит в себе этот путь (Си -> Делфи -> Лазарус). И какое количество раз мне придется "идти на поклон" к корифеям этого форума за ответами на свои идиотские вопросы.
0
Джоуи
 Аватар для Joey
1083 / 645 / 240
Регистрация: 05.05.2015
Сообщений: 3,559
Записей в блоге: 2
06.03.2018, 22:26
Цитата Сообщение от alicesmagic3d Посмотреть сообщение
выяснила, что проще его изучать из С++. Так что Лазарус пока откладывается в сторону
Это тоже пройдет, переболеете (это я без злорадства)... Так что пока ждем кучу новых тем в разделах C++ и C++ и WinAPI)
1
 Аватар для alicesmagic
233 / 130 / 27
Регистрация: 24.08.2016
Сообщений: 875
06.03.2018, 22:40  [ТС]
Цитата Сообщение от Joey Посмотреть сообщение
Это тоже пройдет, переболеете (это я без злорадства)... Так что пока ждем кучу новых тем в разделах C++ и C++ и WinAPI)
Да. Я предпочитаю переболеть и повысить иммунитет (получить опыт), нежели вовремя "привиться" (вообще не изучать) и радоваться своевременной победе над болезнью
0
602 / 550 / 210
Регистрация: 24.01.2012
Сообщений: 1,352
07.03.2018, 14:08
Лучший ответ Сообщение было отмечено alicesmagic3d как решение

Решение

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
procedure TForm1.Button1Click(Sender: TObject);
var i:hdc;
    j:handle;
  b:graphics.tbitmap;
begin
  // нужно подключить модуль windows
 
  j:=getdesktopwindow;
  //получаем dc экрана (нужно для функции копирования)
  i:=getdc(j);
  //создаем bitmap 200 на 200 для примера
  b:=graphics.tbitmap.Create;
  b.Width:=200;
  b.Height:=200;
  //копируем в него область экрана 200 на 200 с координатами 0,0
  BitBlt(b.Canvas.Handle,0,0,200,200,i,0,0,SRCCOPY);
  b.LoadFromDevice(b.Canvas.Handle);
  //освобождаем полученный ранее dc экрана
  releasedc(j,i);
  // теперь имеется битмап, с доступом к каждой точке, как к элементу массива
  //т.е. можно проанализировать цвет каждой точки обращаясь к
  //b.canvas.pixels[x,y] Как распознать текст на картинке я не знаю
  // в принципе можно сохранить изображение в файл командой
  //b.SaveToFile('c:\111.bmp'); и распознать текст сторонней программой
  //после завершения обработки удаляем объект
  b.Free;
end;
1
 Аватар для alicesmagic
233 / 130 / 27
Регистрация: 24.08.2016
Сообщений: 875
07.03.2018, 14:33  [ТС]
Ого! Спасибо огромное!!! Теперь есть от чего танцевать)
Буду изучать ваш код и экспериментировать с цветом. Распознаванием текста займусь потом, когда придет полное понимание как получать и использовать полученный массив пикселей с уже известными цветами. Может и у самой получится придумать алгоритм распознавания символов на основе имеющейся информации по расположению пикселей фона и пикселей самого символа.
Еще раз, огромное спасибо вам за помощь!!!
0
 Аватар для vlisp
1064 / 985 / 153
Регистрация: 10.08.2015
Сообщений: 5,374
07.03.2018, 15:03
Вообще, если по хорошему, то текст это тоже окно, достаточно выловить его хендл и не нужно все это мракобесие с распознаванием картинки, лучше копать в эту сторону.
1
Фрилансер
 Аватар для Black Fregat
3709 / 2083 / 567
Регистрация: 31.05.2009
Сообщений: 6,683
07.03.2018, 15:06
Цитата Сообщение от vlisp Посмотреть сообщение
текст это тоже окно
Не факт, он может отрисовываться напрямую, особенно в такой графике
1
 Аватар для alicesmagic
233 / 130 / 27
Регистрация: 24.08.2016
Сообщений: 875
08.03.2018, 01:41  [ТС]
Цитата Сообщение от vlisp Посмотреть сообщение
...текст это тоже окно, достаточно выловить его хендл...
а как можно отловить хендл текста?
"Он может отрисовываться напрямую" но проверить то не помешает, раз уж есть такая возможность обойтись без мракобесия)))
Не могли бы вы показать это вылавливание (если, конечно, это не займет много вашего времени) на примере следующей строки:

"Вылови меня"
0
Фрилансер
 Аватар для Black Fregat
3709 / 2083 / 567
Регистрация: 31.05.2009
Сообщений: 6,683
08.03.2018, 06:03
Есть программы, которые позволяют увидеть всю иерархию окон - WinSight32, SpyXX и другие.
SpyXX вроде как входит в поставку Visual Studio

Или программно - через функции типа FindWindowEx, EnumChildWindows и другие того же гнезда
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.03.2018, 06:03
Помогаю со студенческими работами здесь

Как зделать чтобы было видно иконка работающей программы в правом нижнем углу
За рании блогадарю. Извинаюсь за плохой русскйи.

Можно ли распознавать текст защитного кода?
Можно ли распознавать текст защитного кода. Смотрите на картинку: Результат: 6768(как текст). Или же есть какие - то сервисы для...

А можно ли установить Windows ХР в другой раздел при работающей Windows Vista?
Можно ли при установленной висте поставить ХР на другой раздел?:)

Удалить Windows XP, оставив работающей Winows 7. Windows XP был установлена первой.
Здравствуйте! У меня есть два логических диска C и D. На первом - Windows XP, на втором - Windows 7. Я хочу отформатировать диск С,...

Выкидывает из работающей программы
Всем привет! Пишу сюда т.к. не знаю какие разделы могут подойти для моей программы. Точнее не совсем моей. Собственно вот она. program...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru