krukovis
20.02.2012, 20:04
Хочу познакомить вас с интересной статьей по поводу создания интерфейса для своих утилит и обсудить ее. Автор Interest07, статья на английсом ТУТ ([Ссылки могут видеть только зарегистрированные и активированные пользователи]).
Мой вариант перевода :
Эта небольшая утилита над которой я работал последнее время. Меня всегда интересовало добавление внутриигрового меню для моих утилит. Потому что хорошо интегрированные утилиты легче использовать и они лучше "ощущаются" при использовании.
[Ссылки могут видеть только зарегистрированные и активированные пользователи]
Самый простой путь сделать это (на сколько я знаю) это сделать внедрение DLL в процесс elementclient. Вы можете сделать это при запуске процесса или когда процесс уже запущен. Я выбрал первый вариант: "Внедрение DLL при запуске", описанный здесь более подробно. На этой странице вы так же можете скачать простой в использовании пример внедрения, я использовал точно такой же в своем инжекторе. Не нужно снова изобретать велосипед.
У нас есть инжектор, теперь нам нужна DLL для внедрения. Инжектор вызывает функцию 'Initialize()' из этой DLL, ждет ответа и затем выходит. Итак, в DLL мы должны сделать функцию Initialize() , которая при получении ответа, создаст новый поток в котором мы можем создать основной цикл. До инициализации все потоки ждут создания основного окна. Создание окна можно контролировать на существование hWnd в памяти. Вам понадобится hWnd окна для вызовов различных Win32 API-функций.
Игра использует Direct3D для отображения графических объектов между запросами BeginScene и EndScene . Итак, если мы хотим отобразить наши объекты мы должны прикрепить вызов функции к EndScene и добавить наши объекты прямо перед этим вызовом. Таким образом наши объекты отобразятся во всех фреймах (и над всеми меню). К счастью, существует много инструкций как прикрепить функцию к EndFrame для различных версий Direct3D. PWI использует Direct3D 8, вы можете нагуглить метод прикрепления функции. Если вам не инетересно досконально изучать как это работает, я прикрепил исходный код для этой небольшой утилиты, вы можете просто посмотреть там.
Сделав это мы можем просто создать некоторый класс-обертку для создания различных контролов для управления основным окном (кнопки, лейблы, флажки и т.д.) Итак...теперь мы можем нарисовать меню, но мы все еще не знаем как определить когда пользователь нажмет например на кнопку, или перетащит меню. Вы так же не можете кликать по контролам в основном окне игре, клики нужно перехватывать до того как их сделают. Хорошо, что win32 API-функции представляют хорошие методы для этого:
WNDPROC wpOrigEditProc = (WNDPROC)SetWindowLong(hwnd, GWL_WNDPROC, (LONG) WndProc);
Где WndProc - это наша функция для управления различными посланиями окну, такими как клик кнопки мыши/нажатие клавиши, и wpOrigEditProc - это функция PWI. Теперь вы проверяете послания окну PWI, вашим ли контролам они адресованы, и если нет, вы вызываете wpOrigEditProc с теми же параметрами и игра продолжается по обычному сценарию.
Хорошо, это первый кирпичик по созданию внутриигрового меню. Проще посмотреть исходники, чтобы увидеть как это работает (итоговая функциональность программы, конечно, спорна, двухминутный исходник на авто ит мог бы сделать тоже самое). Структуры были созданы в программе "ReClass" которую можно найти ЗДЕСЬ ([Ссылки могут видеть только зарегистрированные и активированные пользователи]). Это изящный инструмент для исследования структуру игры в памяти.
Прикрепленный AutoPot.rar содержит Инжектор + DLL + ресурсы необходимые для отрисовки внутриигрового меню. Просто распакуйте это в папку Element (рядом с elementclient.exe)
Заметка: Для нормальной компиляции DLL нужно установить Direct3D 8 SDK. (прим. пер. - видимо исходники DLL автор уже удалил на момент перевода)
Ссылки на файлы:
AutoPot ([Ссылки могут видеть только зарегистрированные и активированные пользователи]) - тот же что и на сайте.
Исходники инжектора ([Ссылки могут видеть только зарегистрированные и активированные пользователи])
Примечание: Автопот не работает. Основная польза от этого - сам прицип создания меню для программ и инжектор DLL.
Скачать ReClass ([Ссылки могут видеть только зарегистрированные и активированные пользователи]) - перезалил сюда, потому что по ссылке выше нужно пройти семь кругов ада чтобы скачать эту утилиту.
Мой вариант перевода :
Эта небольшая утилита над которой я работал последнее время. Меня всегда интересовало добавление внутриигрового меню для моих утилит. Потому что хорошо интегрированные утилиты легче использовать и они лучше "ощущаются" при использовании.
[Ссылки могут видеть только зарегистрированные и активированные пользователи]
Самый простой путь сделать это (на сколько я знаю) это сделать внедрение DLL в процесс elementclient. Вы можете сделать это при запуске процесса или когда процесс уже запущен. Я выбрал первый вариант: "Внедрение DLL при запуске", описанный здесь более подробно. На этой странице вы так же можете скачать простой в использовании пример внедрения, я использовал точно такой же в своем инжекторе. Не нужно снова изобретать велосипед.
У нас есть инжектор, теперь нам нужна DLL для внедрения. Инжектор вызывает функцию 'Initialize()' из этой DLL, ждет ответа и затем выходит. Итак, в DLL мы должны сделать функцию Initialize() , которая при получении ответа, создаст новый поток в котором мы можем создать основной цикл. До инициализации все потоки ждут создания основного окна. Создание окна можно контролировать на существование hWnd в памяти. Вам понадобится hWnd окна для вызовов различных Win32 API-функций.
Игра использует Direct3D для отображения графических объектов между запросами BeginScene и EndScene . Итак, если мы хотим отобразить наши объекты мы должны прикрепить вызов функции к EndScene и добавить наши объекты прямо перед этим вызовом. Таким образом наши объекты отобразятся во всех фреймах (и над всеми меню). К счастью, существует много инструкций как прикрепить функцию к EndFrame для различных версий Direct3D. PWI использует Direct3D 8, вы можете нагуглить метод прикрепления функции. Если вам не инетересно досконально изучать как это работает, я прикрепил исходный код для этой небольшой утилиты, вы можете просто посмотреть там.
Сделав это мы можем просто создать некоторый класс-обертку для создания различных контролов для управления основным окном (кнопки, лейблы, флажки и т.д.) Итак...теперь мы можем нарисовать меню, но мы все еще не знаем как определить когда пользователь нажмет например на кнопку, или перетащит меню. Вы так же не можете кликать по контролам в основном окне игре, клики нужно перехватывать до того как их сделают. Хорошо, что win32 API-функции представляют хорошие методы для этого:
WNDPROC wpOrigEditProc = (WNDPROC)SetWindowLong(hwnd, GWL_WNDPROC, (LONG) WndProc);
Где WndProc - это наша функция для управления различными посланиями окну, такими как клик кнопки мыши/нажатие клавиши, и wpOrigEditProc - это функция PWI. Теперь вы проверяете послания окну PWI, вашим ли контролам они адресованы, и если нет, вы вызываете wpOrigEditProc с теми же параметрами и игра продолжается по обычному сценарию.
Хорошо, это первый кирпичик по созданию внутриигрового меню. Проще посмотреть исходники, чтобы увидеть как это работает (итоговая функциональность программы, конечно, спорна, двухминутный исходник на авто ит мог бы сделать тоже самое). Структуры были созданы в программе "ReClass" которую можно найти ЗДЕСЬ ([Ссылки могут видеть только зарегистрированные и активированные пользователи]). Это изящный инструмент для исследования структуру игры в памяти.
Прикрепленный AutoPot.rar содержит Инжектор + DLL + ресурсы необходимые для отрисовки внутриигрового меню. Просто распакуйте это в папку Element (рядом с elementclient.exe)
Заметка: Для нормальной компиляции DLL нужно установить Direct3D 8 SDK. (прим. пер. - видимо исходники DLL автор уже удалил на момент перевода)
Ссылки на файлы:
AutoPot ([Ссылки могут видеть только зарегистрированные и активированные пользователи]) - тот же что и на сайте.
Исходники инжектора ([Ссылки могут видеть только зарегистрированные и активированные пользователи])
Примечание: Автопот не работает. Основная польза от этого - сам прицип создания меню для программ и инжектор DLL.
Скачать ReClass ([Ссылки могут видеть только зарегистрированные и активированные пользователи]) - перезалил сюда, потому что по ссылке выше нужно пройти семь кругов ада чтобы скачать эту утилиту.