PDA

Просмотр полной версии : как написать бот на делфи


libertas
10.01.2013, 22:00
Доброго времени суток всем!
ПроГуглил, ПроЯндексил, ПроМаилрушил весь рунет, но адекватного решения так и не нашел.
По этому обращаюсь к вам!!!
Задался идеей написать простенький бот для онлайн игры (неважно какой) на Delphi. не большой опыт программирования есть.
Условия в игре:
1. я бью мобов на 10 левлов ниже себя - контролировать манну и хп не надо (урона по мне не проходит);
2. бью массами (к примеру на кнопках F1 и F2) - то есть таргет мобов не нужен;
3. сбор лута на кнопке - Q или на панели F5
Итог надо, чтоб бот посылал в окно игры эмуляции нажатия F1, F2, F5, и всё это в свернутое окно.

А теперь к сути вопроса…
С помощью SPY++ нахожу хендл окна, а дальше...
Keybd_event в данном случае не подходит как и SendMassage, т.к. в первом случае хоть и указывал хендл окна нажатие происходит в моем окне(может что не правильно сделал); а во втором случае меняется только название окна.
Потом пришел к такому решению PostMessage(Handle, WM_KEYDOWN, VK_F1, 0) , но и это не дало желаемого результата. Работало в простеньких играх и приложениях виндовс (типо блокнота) и ни фига не хотело работать с приложениями директикс.
Потом мне подсказали сделать это так PostMessage(Handle, WM_IME_KEYDOWN, VK_F1, 0), заработало но только при условии открытого окна Т.т

Внимание вопрос Ы:
- Как заставить работать программу со свернутым окном игры?
- Может кто знает другой способ рения этой проблемы?
- Может где есть на форуме дайте ссылку?
- Может у кого есть исходник готовой схожей программы дайте плиз?

З.Ы. За раннее всем благодарен за помощь

Dinmaite
10.01.2013, 22:26
Вообще-то игра имеет значение. К примеру в Ла2 таким образом ничего не сделаешь, в ПВ - всегда пожалуйста, в JD - не будут действовать доп. клавиши. Еще в коком-то проекте от мылару (не помню название) придется искать не хендл окна, а хендл контрола, отображающего картинку. Это только то что удалось вспомить на первый момент.

Sinyss
10.01.2013, 22:51
- Может кто знает другой способ рения этой проблемы?
Полная реализация клиента, но без текстур с нужным функционалом... но как - твои проблемы )

metraz
10.01.2013, 23:09
большинство игр не поддерживают нажатия в свернутом режиме. Опять же, еще зависит от того какая игра.

Эмрис
10.01.2013, 23:09
Вообще-то игра имеет значение. К примеру в Ла2 таким образом ничего не сделаешь, в ПВ - всегда пожалуйста, в JD - не будут действовать доп. клавиши. Еще в коком-то проекте от мылару (не помню название) придется искать не хендл окна, а хендл контрола, отображающего картинку. Это только то что удалось вспомить на первый момент.

[Ссылки могут видеть только зарегистрированные и активированные пользователи] - про хэндл

libertas
10.01.2013, 23:33
Ваши ответы учтены. Но принципиально ничего нового я не узнал.
А про то что игры разные бывают я уже писал
Потом мне подсказали сделать это так PostMessage(Handle, WM_IME_KEYDOWN, VK_F1, 0), заработало но только при условии открытого окна Т.т
Вот часть кода которая работает но только при открытом окне игры
var h:HWND;
begin

sleep(2000);
h:= FindWindow('Game L',nil);
SetForegroundWindow(h);
PostMessage(h, WM_IME_KEYDOWN, VK_F1,MapVirtualKey(VK_F1, 0));
end;

а я хочу чтоб это передавалось в свернутое окно но похоже что это НЕ РЕАЛЬНО /facepalm

Dinmaite
12.01.2013, 00:17
И для чего здесь фейспалм?

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

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

libertas
12.01.2013, 05:21
ОГРОМНОЕ СПАСИБО всем за ответы!!!
ПРОБЛЕМА РЕШЕНА!!! :hd: :elefant: :ban:
Способом который уже пробовал, но видимо, что-то, где-то не до глядел /problem
ВОТ ТАК:
SetForegroundWindow(FindWindow('Game L',nil));
keybd_event(VK_F1, MapvirtualKey(VK_F1, 0), 0, 0);
keybd_event(VK_F1, MapvirtualKey(VK_F1, 0),KEYEVENTF_KEYUP , 0)
теперь работает в свернутом окне, только пришлось стандартный звук винды отключать чтоб не пищал ;)

З.Ы. Еще раз спасибо и сори что из за своей тупости парил вам мозги.
З.Ы.Ы. Отдельно огромное спс, Dinmaite, подкинул пищу для ума про инжекты кода в процесс игры для меня это что то новенькое , буду изучать=)
:z: