Задача

Обсуждения по программированию для ОС Windows безотносительно используемого языка программирования. Windows NT, Win32, Windows API, ядро и драйверы.
Tuco
Постоялец
Постоялец
 
Сообщения: 508
Зарегистрирован: 18.06.2003 (Ср) 16:37
Откуда: Подмосковье

Задача

Сообщение Tuco » 08.09.2012 (Сб) 20:28

Привет, братья по бейсику!
Сам себе придумал задачу, но не знаю, с чего даже начинать её решение. И не знаю, как вообще будет проходить всё. Нужно на экране найти прямоугольник, а внутри него, в резных местах, слова и числа. Они появляются из другой программы, а моя программа должна работать, даже не будучи в активном окне. Потому обращаюсь к вам, друзья мои. Буду благодарен за любую помощь.
"There's more than one way to do it!"

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 08.09.2012 (Сб) 21:23

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

Tuco
Постоялец
Постоялец
 
Сообщения: 508
Зарегистрирован: 18.06.2003 (Ср) 16:37
Откуда: Подмосковье

Re: Задача

Сообщение Tuco » 08.09.2012 (Сб) 21:43

Спасибо за быстрый ответ, в субботу-то вечером! Как увидеть окно чужой программы?
"There's more than one way to do it!"

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 08.09.2012 (Сб) 22:12

Перебрать окна с помощью EnumWindows, выбрать нужное по классу/заголовку/процессу. Определить его положение.

Tuco
Постоялец
Постоялец
 
Сообщения: 508
Зарегистрирован: 18.06.2003 (Ср) 16:37
Откуда: Подмосковье

Re: Задача

Сообщение Tuco » 08.09.2012 (Сб) 22:22

а реально ли захватить весь экран и на полученной картинке найти нужное окно?
"There's more than one way to do it!"

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 08.09.2012 (Сб) 22:23

Это не нужно. Через EnumWindows проще.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Задача

Сообщение Хакер » 08.09.2012 (Сб) 23:41

  • Найти нужное окно в Spy++ (или аналогичном софте).
  • Посмотреть, являются ли интересующие надписи отдельными окнами (что-то вроде STATIC-ов) или же текст тупо отрисовывается (в этом случае Spy++ на месте надписей ничего не покажет).
  • Если являются — получать текст из них прямо вызовом GetWindowText.
  • Если не являются — программа должна работать так.

  • Находим нужное окно.
  • Находим процесс, владеющий окном
  • Внедряемся в процесс.
  • Перехватываем все API-функции, отрисовывающие текст (ExtTextOut, DrawText и т.п.)
  • В перехватчике нужно определять, входят ли координаты места, в которое запрошена отрисовка, в интересующий нас прямоугольник, и если да — рапортовать основной программе.
  • PROFIT!

Это метод тоже может не сработать, если программа отрисовывает текст не стандартными API-функциями, а с нуля какими-то своими. Хотя случай один на миллион, но бывает. В этом случае только OCR или чуть-чуть пореверсить приложение, чтобы понять, в каком месте текст передаётся на кастомную отрисовку.

Переношу в раздел по Windows-программирования, зачем в Народном трепе то создавать тему?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 09.09.2012 (Вс) 0:18

Хакер писал(а):получать текст из них прямо вызовом GetWindowText

Расскажи-ка про неё подробнее.
Почему MSDN рекомендует SendMessage WM_GETTEXT для чужих процессов?
Почему GetWindowText (как и GetWindowTextLength) не работает с текстовым полем диалога сохранения файла, в отличие от SendMessage? (По крайней мере, в Win7 x64).

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Задача

Сообщение Хакер » 09.09.2012 (Вс) 0:21

Qwertiy писал(а):Почему MSDN рекомендует SendMessage WM_GETTEXT для чужих процессов?

Видимо потому что, есть случаи, аналогичные описанному:
Qwertiy писал(а):GetWindowText (как и GetWindowTextLength) не работает с текстовым полем диалога сохранения файла, в отличие от SendMessage?


Потому что, очевидно, кто-то не пользуется родной виндовой возможностью ассоциировать произольный текст в произвльным окном в системе, а хранит нужный текст в каком-то своём месте. Тогда логично, что оконная процедура сама обрабатывает WM_GETTEXT/WM_SETTEXT и оперирует текстом, размещённым каким-то там своим образом.

Но аналогично можно напороться на обратный случай: GetWindowText будет возвращать, что надо, а WM_GETTEXT — будет возвращать ерунду.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 09.09.2012 (Вс) 0:30

Хакер писал(а):Потому что, очевидно, кто-то не пользуется родной виндовой возможностью ассоциировать произольный текст в произвльным окном в системе, а хранит нужный текст в каком-то своём месте.

Хм... В приведённом мной случае речь об обыкновенном диалоге сохранения файла, его класс "#32770". Я так понимаю, это и есть родной виндовый диалог, но GetWindowText для его элемента с классом Edit всегда возвращает пустую строку...

Tuco
Постоялец
Постоялец
 
Сообщения: 508
Зарегистрирован: 18.06.2003 (Ср) 16:37
Откуда: Подмосковье

Re: Задача

Сообщение Tuco » 09.09.2012 (Вс) 7:05

спасибо!
забыл уточнить, обрабатываемая прога работает в виртуальной машине. spy++ её отловит ли из машины-хоста?
"There's more than one way to do it!"

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 09.09.2012 (Вс) 10:27

Думаю, нет.
Почему бы твою прогу тоже в виртуалке не запускать?
Элементы ListBox'а можно получить с помощью SendMessage LB_GETTEXTLEN и LB_GETTEXT.

Tuco
Постоялец
Постоялец
 
Сообщения: 508
Зарегистрирован: 18.06.2003 (Ср) 16:37
Откуда: Подмосковье

Re: Задача

Сообщение Tuco » 09.09.2012 (Вс) 12:19

моя прога и подопытная должны быть на разных машинах. можно тогда мою в виртуальную сунуть, тогда главную на хост
"There's more than one way to do it!"

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Задача

Сообщение Хакер » 09.09.2012 (Вс) 13:02

Qwertiy писал(а):Хм... В приведённом мной случае речь об обыкновенном диалоге сохранения файла, его класс "#32770". Я так понимаю, это и есть родной виндовый диалог, но GetWindowText для его элемента с классом Edit всегда возвращает пустую строку...

Вероятно Edit сабклассится. Или это может быть вообще под горе-семёркой для всех эдитов справедливо. Не задавался таким вопросом и не копал я.

Tuco писал(а):забыл уточнить, обрабатываемая прога работает в виртуальной машине. spy++ её отловит ли из машины-хоста?

Конечно же нет.

Tuco писал(а):моя прога и подопытная должны быть на разных машинах. можно тогда мою в виртуальную сунуть, тогда главную на хост

Какая разница. Они полностью физически изолированы друг от друга.
Откуда проистекает требования, что программы должны работать на разных машинах? Обычно люди по собственной глупости придумывают себе ненужные требования и тратят кучу сил, чтобы уложиться в эти требования.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Tuco
Постоялец
Постоялец
 
Сообщения: 508
Зарегистрирован: 18.06.2003 (Ср) 16:37
Откуда: Подмосковье

Re: Задача

Сообщение Tuco » 09.09.2012 (Вс) 13:46

привет! Спасибо за уделенное мне время!
Не хочу писать во всеобщем доступе. Условия задачи обеспечены условиями конспирации. Это будет нечто типа покерного бота. но не бот, конечно. Не нужно всё же покерному клиенту иметь доступ к машине, на которой работает моя прога
"There's more than one way to do it!"

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 09.09.2012 (Вс) 13:59

Tuco писал(а):моя прога и подопытная должны быть на разных машинах

Тогда только распознавание.

Tuco писал(а):Не нужно всё же покерному клиенту иметь доступ к машине, на которой работает моя прога

Ты хочешь скрыть от него факт существования твоей проги?
У меня большое подозрение, что тогда ты вообще никак с ней взаимодействовать не сможешь. Т. е. распознать скрин ты сможешь, но повлиять как-то на клиент - нет.

К тому же, обращаю внимание, что сообщения показываются на некоторое непродолжительное время, а список прокручивается. По идее (не проверял), получение элемента списка по индексу работать должно, а вот с распознаванием будет куча проблем.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Задача

Сообщение iGrok » 09.09.2012 (Вс) 14:03

Ну, может ещё можно поковыряться в сторону удалённой отладки, но думается мне, это тоже не прокатит.

А в данном конкретном случае нужно вообще перехватывать и анализировать трафик.
label:
cli
jmp label

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Задача

Сообщение Хакер » 09.09.2012 (Вс) 14:08

Почему бы не запустить покерный бот и твою программу на виртуалке вместе.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 09.09.2012 (Вс) 14:22

Насколько я понимаю, он не хочет чтобы программа вообще знала, что бот запущен. Тогда использование WinApi с окнами программы становится невозможным, остаётся только OCR.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Задача

Сообщение iGrok » 09.09.2012 (Вс) 14:56

Хакер писал(а):Почему бы не запустить покерный бот и твою программу на виртуалке вместе.

Ну, судя по всему, он хочет сам написать что-то типа бота, а программа, которую нужно отслеживать - это покерный клиент. А запускать их вместе нельзя из-за встроенной защиты покерного клиента, т.к. его тоже не дураки делают, и уже давно научились отслеживать подобные вещи и банить умельцев вместе с их счетами.
label:
cli
jmp label

Tuco
Постоялец
Постоялец
 
Сообщения: 508
Зарегистрирован: 18.06.2003 (Ср) 16:37
Откуда: Подмосковье

Re: Задача

Сообщение Tuco » 09.09.2012 (Вс) 15:02

Друзья мои, ещё раз напоминаю, что это не бот! Мне нужно только считать мои карты, и действия других участников до моего первого слова. Дальше всё я делаю сам, вручную.
"There's more than one way to do it!"

Tuco
Постоялец
Постоялец
 
Сообщения: 508
Зарегистрирован: 18.06.2003 (Ср) 16:37
Откуда: Подмосковье

Re: Задача

Сообщение Tuco » 09.09.2012 (Вс) 15:05

iGrok писал(а):
Хакер писал(а):Почему бы не запустить покерный бот и твою программу на виртуалке вместе.

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

именно так и происходит примерно. мне нужно отслеживать клиента, а авторы не разбираются в моих идеях. действия сомнительны - бан, хотя я ничего предосудительного не планирую
"There's more than one way to do it!"

Tuco
Постоялец
Постоялец
 
Сообщения: 508
Зарегистрирован: 18.06.2003 (Ср) 16:37
Откуда: Подмосковье

Re: Задача

Сообщение Tuco » 09.09.2012 (Вс) 15:49

я думаю, что моя задача близка к QR-кодам. Ведь как-то нужно опознать 3 метки и код внутри квадрата... Дальше-то как действовать?
"There's more than one way to do it!"

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 09.09.2012 (Вс) 16:04

Изображение на экране. Оно хорошего качества. Просто прикладываешь символ и смотришь результат - совпало, значит он.

Tuco
Постоялец
Постоялец
 
Сообщения: 508
Зарегистрирован: 18.06.2003 (Ср) 16:37
Откуда: Подмосковье

Re: Задача

Сообщение Tuco » 09.09.2012 (Вс) 16:43

правильно. как это делается?
"There's more than one way to do it!"

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 09.09.2012 (Вс) 17:08

Попиксельным сравнением. Пишешь текст и попиксельно сравиниваешь.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Задача

Сообщение Хакер » 09.09.2012 (Вс) 17:18

iGrok писал(а):А запускать их вместе нельзя из-за встроенной защиты покерного клиента, т.к. его тоже не дураки делают, и уже давно научились отслеживать подобные вещи и банить умельцев вместе с их счетами.

Дураки не дураки, а ведь клиент не всесилен. Какой там механизм защиты? Если данные выводятся не на windowsless-контролы, то для получения текста даже не нужно ничего подозрительного делать. Вызов GetWindowText/WM_GETTEXT будет расценен покерным клиентом как нелегальное действие?

Qwertiy писал(а):Изображение на экране. Оно хорошего качества. Просто прикладываешь символ и смотришь результат - совпало, значит он.

Если там текст не моноширинный, то нужно учиывать её кернинговые пары. А если текст с антиалиасингом — то вообще весело.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Tuco
Постоялец
Постоялец
 
Сообщения: 508
Зарегистрирован: 18.06.2003 (Ср) 16:37
Откуда: Подмосковье

Re: Задача

Сообщение Tuco » 09.09.2012 (Вс) 18:04

кто их знает, что они пихают в систему вместе с клиентом... может даже какой-то аналог троянца... лучше перестраховаться...
а как попиксельно сравнивать?
"There's more than one way to do it!"

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 09.09.2012 (Вс) 18:27

Хакер писал(а):Какой там механизм защиты?

А кто его знает? Мне когда-то случайно где-то попадолось обсуждение того, откуда брать траектории движения мыши для нажатия на кнопки... Если это действительно надо, то постоянные LB_GETTEXT вполне могут быть расценены как подозрительные...

Хакер писал(а):Если там текст не моноширинный, то нужно учиывать её кернинговые пары. А если текст с антиалиасингом — то вообще весело.

Зачем тут мудрить, если шрифт известен? небольшой перебор позиции и всё должно работать.
В списке чата, из которого я предлагаю брать информацию, шрифт вполне обыкновенный. Не думаю, что с ним будут проблемы. Только, он прокручивается, т. е. время ограничено, а автодействие вполне может использоваться несколькими игроками. Но если чат отсоединить, то строк станет достаточно.
А вот если не из чата, то она выводится не через контролы и отображается около секунды на экране. Если искать там сумму ставки, то она ещё и в разных местах может появляться. А вот само действие - фактически можно заготовить несколько шаблонов и с ними сравнивать.

Tuco писал(а):а как попиксельно сравнивать?

Ну берёшь строку списка, и берёшь кучу шаблонов (по числу возможных символов). Пытаешься прикладывать, допустим со сдвигом -2 to +2 пискселя от текущей линии. Если совпадает, переносишь линию и переходишь к следующему символу.

Tuco
Постоялец
Постоялец
 
Сообщения: 508
Зарегистрирован: 18.06.2003 (Ср) 16:37
Откуда: Подмосковье

Re: Задача

Сообщение Tuco » 09.09.2012 (Вс) 19:15

заранее известны варианты ответа - fold, call, raise. их видно на экране в одном и том же месте (6-9 мест на поле одного и того же размера). Если , к примеру, нажать alt+prtscr в буфере окажется именно это поле. Как найти эти 6-9 мест и проверить на соответствие шаблону?
"There's more than one way to do it!"

След.

Вернуться в Windows-программирование

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6

    TopList  
cron