Прочтите экранный текст из внешнего приложения. Перехват API?

У меня есть опыт работы с Java, поэтому мои знания о C # и C ++ ограничены. В основном я пытаюсь «прочитать» текст из другого приложения, который отображается на экране ...

введите описание изображения здесь

Чтобы быть конкретным, я хочу прочитать сообщение в чате дилера от Pokerstars ... на лету ...

Как лучше всего «на лету» прочитать этот текст в Java-программе? Я задумываюсь о подключении API, это единственный способ и как мне это сделать на Java?

Спасибо Фил


person p_mcp    schedule 25.04.2011    source источник
comment
Это не обман ... Я создаю программу для отслеживания покера, очень похожую на Hold'em Manager, которая на 100% легальна. , Спасибо   -  person p_mcp    schedule 26.04.2011
comment
Если он просто читает текст, который уже находится на его экране, вряд ли это будет обман.   -  person Puppy    schedule 26.04.2011
comment
@deadmg, как бы вы написали покерного бота, не читая текст на экране? В любом случае объяснение Фила проясняет это.   -  person David Heffernan    schedule 26.04.2011
comment
Думаю, здесь уже задавали аналогичный вопрос и на него ответили: stackoverflow.com/questions/352236/ Я надеюсь, что это вам поможет.   -  person Bart    schedule 26.04.2011
comment
@PhilMcParlane, как вы наконец решили проблему? Вы использовали OCR в соответствии с рекомендациями bmcnett или нашли способ лучше? У меня такая же проблема, как и у вас, и мне кажется, что распознавание текста излишне. Спасибо   -  person Maarty    schedule 14.03.2016
comment
@Maarty, к сожалению, мне пришлось отключить текстовые тени на окнах, прежде чем очищать фактические необработанные пиксели для разных символов шрифта (это было абсолютно ужасно, и я не хотел бы, чтобы кто-то прошел).   -  person p_mcp    schedule 15.03.2016


Ответы (2)


Один из способов сделать это, который работает до тех пор, пока текст не сглажен, как на вашем изображении:

Из своего приложения сделайте снимок экрана с окном другого приложения. Найдите на снимке экрана все небелые пиксели. Составьте список всех небелых пикселей. Для каждой пары небелых пикселей в списке, если пара соприкасается друг с другом, поместите их в одну «группу». Делайте это, пока все пиксели не сгруппируются вместе.

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

Теперь у вас есть коды ASCII для всех букв в окне.

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

person Community    schedule 25.04.2011
comment
Привет, я надеялся не использовать OCR, потому что я планирую его обрабатывать сразу несколько таблиц, и я не хочу, чтобы передавалось много скриншотов ... в любом случае спасибо за ваш вклад! - person p_mcp; 26.04.2011
comment
То, о чем я говорю, намного проще, чем OCR. OCR сможет распознавать буквы практически любого шрифта. То, о чем я говорю, может распознавать только буквы, которые уже видны, с точным битовым шаблоном. - person ; 26.04.2011
comment
Это перебор. Прочтите статью «Перехват API» (например, обход или EasyHook), чтобы узнать, что приложение пишет на экране. - person Marc Climent; 22.06.2011

Если приложение, к которому вы хотите подключиться, - это C #, то, возможно, вам стоит начать с рефлектора.

http://reflector.red-gate.com/download.aspx?TreatAsUpdate=1

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

http://www.wireshark.org/

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

Удачи.

person Angelom    schedule 25.04.2011
comment
Так что, если я просто послушаю порт 26002 (порт Pokerstars) в Java и проанализирую там данные? (Извините, я не эксперт в низкоуровневых вычислениях ...) - person p_mcp; 26.04.2011