2016-03-13 3 views
2

Я пытаюсь создать игровой бот для игры, у которой нет программного интерфейса. Например, как я могу сделать программу, которая играет игру «Саперы» Window? Не делайте мою собственную игру Minesweeper и не программируйте ее, а скорее игру в окно. Я просто ищу методологию, которая будет использоваться для такой программы. Должен ли я использовать программное обеспечение для захвата экрана и определить, что означает группа пикселей и интерфейс?Взаимодействие с приложением, не имеющим встроенного API

ответ

1

Для приложения Windows вы можете использовать SendMessage для отправки эмулированных команд мыши и клавиатуры в другое приложение.

Вам нужно будет получить HWND, который вы можете получить с FindWindow или эквивалент (ваша версия Windows, будет влиять на это, так как на более ранних версиях Windows, вы перебирать окна ручки ищет имя исполняемого файла, в то время как на Windows 8 и за пределами некоторых приложений не видны без специальной обработки - MSDN будет иметь документацию по этому вопросу).

грейферный захват экрана экрана без DirectX приложений с помощью GetDC, затем BitBlt скопировать экран в растровое изображение вашей собственной, то ReleaseDC. Например. с Minesweeper, если ваш «бот» запоминает предыдущий снимок экрана, выполните разницу между этим и текущим, чтобы найти местоположения, которые изменились с момента последнего хода.

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

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

Для конкретных веб-приложений ограничения межсайтового скриптинга затруднят использование этого подхода. Существует два нормальных способа сделать эту работу для веб-приложений: 0). Вставьте элемент управления веб-браузера в приложение «бот» и добавьте дополнительный javascript на загрузку страницы (поскольку элементы управления приложения являются динамическими), но это становится немного сложнее так как вы можете иметь несколько уровней и несколько кадров, а также дополнительные API (HTML5, WebGL и т. д.). 2) использовать автономный движок html/javascript для рендеринга/выполнения только по большей части кода на стороне клиента, а затем изменять состояние напрямую (например, если вы хотите эмулировать кнопку, нажмите, чтобы сообщения удаленный сервер, просто используйте механизм javascript для прямого вызова функции обработчика кнопок.

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

Обратите внимание, что операционные системы защищают свои приложения, поэтому получение доступа к памяти запущенного приложения будет опасным, если вы не будете очень осторожны, и выяснить, что делает память, будет практически невозможно.Учтите, что Windows динамически загружает большинство DLL на случайные базовые адреса в качестве меры безопасности, а приложения обычно используют GlobalAlloc (или эквивалент не Windows) для хранения основной части своих данных, поэтому, даже если вы найдете данные, о которых вы заботитесь, это выиграло Когда вы запускаете приложение, вы будете в том же месте.

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

1

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

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

Или вы можете надолго закодировать программу, которая считывает операционную память ОЗУ для ее анализа. Я думаю, что двигатель Cheat работает так.

+0

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

0

Для захвата окна целевого приложения вам необязательно нужны вызовы API Win32 с низким уровнем. Вы должны сделать это с помощью .NET. См. http://www.codeproject.com/Articles/12898/Screen-Capturing Как только у вас есть цель HWND (см. Ответ Мэтта Джордана), вы можете создать элемент управления .NET с помощью Control.FromHWND(). Затем capture() окно в Bitmap.

Для средств автоматизации: в простой игре, такой как тральщик, предметы, которые вам нужно посмотреть, организованы как сетка. Вы можете просто сканировать битмап, считываемый из целевого окна, и исследовать пиксели в определенных положениях. Общий случай требует более сложных инструментов. OpenCV, как было предложено girod_s, должно быть хорошей догадкой.

Все остальное уже было сказано Мэттом Иорданом.

Если вы хотите, не забудьте остаться на юридической стороне, не пытайтесь работать непосредственно в ОЗУ целевого приложения. Однако вы все равно должны взглянуть на условия лицензии этого приложения (см. Мой комментарий к ответу girod_s).