Переименовать окно игры в ник

Winteriscoming

Путник
Пользователь
Сообщения
31
Розыгрыши
0
Репутация
0
Реакции
2
Баллы
0
Хочу сделать метод, что бы через комьюнти переименовывать окно в ник активного перса. Не могу разобраться как это делать, подскажите куда копать? Или с серверной части не смогу это сделать и надо работать с клиентом?
 
Обратите внимание, что данный пользователь заблокирован! Не совершайте с ним никаких сделок! Перейдите в его профиль, чтобы узнать причину блокировки.
Тут есть пару пацыков *клиент девов* что запилят это за внушительный *пакован* зелени...\
п.с. года 2\3 назад такое видал на каком то Ит серве.... (только окно сразу при входе в игру становилось именем Игрока, что был о удобно в куче окон))
 
Это надо заморачиваться с WinAPI. Тебе нужно найти подходящий пакет (выбор персонажа или вход в мир, хз), в котором бы хранился никнейм игрока и при вызове функции обработки этого пакета добавляешь кусок с переименованием окна по HWND. Примерно так:
SendMessage(GetForegroundWindow(), WM_SETTEXT, 0, szCharacterName);
Хотя тут наверное стоит юзать не GetForegroundWindow, но тут я уже хз.
 
Нужно написать свою длл, которая будет цепляться к клиенту, и в нужный момент менять заголовок окна, в целом это не сложно, но если требуется взаимодействие с сервером при этом, то придется хукать функции, на что может косо смотреть защита.

Это надо заморачиваться с WinAPI. Тебе нужно найти подходящий пакет (выбор персонажа или вход в мир, хз), в котором бы хранился никнейм игрока и при вызове функции обработки этого пакета добавляешь кусок с переименованием окна по HWND. Примерно так:
SendMessage(GetForegroundWindow(), WM_SETTEXT, 0, szCharacterName);
Хотя тут наверное стоит юзать не GetForegroundWindow, но тут я уже хз.

Да, это не надежно, нужно конкретно из текущего клиента вытащить hwnd окна.
 
Последнее редактирование модератором:
Обратите внимание, что данный пользователь заблокирован! Не совершайте с ним никаких сделок! Перейдите в его профиль, чтобы узнать причину блокировки.
типа таких? AbnormalStatusWnd
и о какой хронике тс имел ввиду?

Можно так, но, судя по названию, конкретно AbnormalStatusWnd, видимо, функция обработки сообщений окна AbnormalStatus, а нам нужно другое окно. Да и дергаться она будет очень часто, так что перехватывать ее не особо хорошая затея. Я бы сделал так, патчим CreateWindowExW, оттуда достаем lpClassName, если он такой же, как у главного окна l2 (там константная строка, уже не помню, какая, но узнать легко), то дергаем оригинальную CreateWindowExW, запоминая возвращенный ей hwnd.

Навскидку есть еще пара вариантов, которые могут сработать:

1. В любом месте получаем управление в контексте главного потока l2, и дергаем GetActiveWindow. Может не сработать, ибо этот поток создает не одно окно, нужны тесты.
2. Ставим хук на главный поток через SetWindowsHookEx, с типом хука WH_CALLWNDPROC, и в CallWndProc из параметра lParam, который, на самом деле, PCWPSTRUCT, вытаскиваем hwnd. Правда, есть вероятность, что туда приходят не только события для главного окна, так что, возможно, придется потом еще дернуть GetClassName(hwnd ...), и сравнить полученный класс с классом главного окна l2. Этот вариант тоже нуждается в проверке, зато позволяет обойтись без изменения кодосекции, и является самым чистым.
 
  • Мне нравится
Реакции: kick
Можно так, но, судя по названию, конкретно AbnormalStatusWnd, видимо, функция обработки сообщений окна AbnormalStatus, а нам нужно другое окно. Да и дергаться она будет очень часто, так что перехватывать ее не особо хорошая затея. Я бы сделал так, патчим CreateWindowExW, оттуда достаем lpClassName, если он такой же, как у главного окна l2 (там константная строка, уже не помню, какая, но узнать легко), то дергаем оригинальную CreateWindowExW, запоминая возвращенный ей hwnd.
Тебя троллят, эти окна являются частью XMLUI (привет редактору acmi). Просто делаем врезку на этапе CharSelected и изменяем название окна и вуаля :)
 
Пока писал, понял, что в варианте 1. тоже не обязательно что то перехватывать, потому, что есть функция GetGUIThreadInfo, которая принимает ид конкретного потока.

Тебя троллят, эти окна являются частью XMLUI (привет редактору acmi). Просто делаем врезку на этапе CharSelected и изменяем название окна и вуаля :)

Это кривой способ, ибо требует изменение R проекции кодосекции, а значит не будет работать много где, и будет конфликтовать со всеми нормальными защитами.
 
Последнее редактирование модератором:
Обратите внимание, что данный пользователь заблокирован! Не совершайте с ним никаких сделок! Перейдите в его профиль, чтобы узнать причину блокировки.
видимо, функция обработки сообщений окна AbnormalStatus, а нам нужно другое окно
В игре их 236 примерно, прикреплю тхт может автору полезно)
Интересно что мешает IDA RPO сделать бряк на функции и посмотреть что куда и как при вызове )
 

Вложения

  • api.txt
    8,1 КБ · Просмотры: 82
  • 000.png
    000.png
    13,3 КБ · Просмотры: 208
В игре их 236 примерно, прикреплю тхт может автору полезно)
Интересно что мешает IDA RPO сделать бряк на функции и посмотреть что куда и как при вызове )
Вот только штука в том, что ТСу нужны не внутренние окна, а самое главное окно. Тем более AbnormalStatusWnd на этапе выбора персонажа скорее всего вернет nullptr, так как там это окно отсутствует.
 
Обратите внимание, что данный пользователь заблокирован! Не совершайте с ним никаких сделок! Перейдите в его профиль, чтобы узнать причину блокировки.
Вот только штука в том, что ТСу нужны не внутренние окна, а самое главное окно. Тем более AbnormalStatusWnd на этапе выбора персонажа скорее всего вернет nullptr, так как там это окно отсутствует.
Значит нужно ставить брекпоинт на UNetworkHandler
Загружу скриншот , слева IDA PRO с права CheatEngine как видим Engine.UGameEngine::OnShowTrainListWnd

по сути все Wnd как видим если там посмотреть загруженные библиотеки имеют корень UNetworkHandler
 

Вложения

  • Screenshot_1.png
    Screenshot_1.png
    48,5 КБ · Просмотры: 201
В игре их 236 примерно, прикреплю тхт может автору полезно)
Интересно что мешает IDA RPO сделать бряк на функции и посмотреть что куда и как при вызове )

Не те окна, а вот это:

3b7a7fdb6bab4091b486124e125787fc.png
 
Последнее редактирование модератором:
Проверил сразу вариант 1., как самый простой, все заработало. Общий принцип ниже. Поиск id главного потока оставляю для самостоятельного копания)

Код:
void find_hwnd(HWND &hwnd)
{
    DWORD id = 0x666;

    while (true)
    {
        ::GUITHREADINFO thread_info;
        thread_info.cbSize = sizeof(thread_info);

        if (::GetGUIThreadInfo(id, &thread_info))
        {
            hwnd = thread_info.hwndActive;
            break;
        }

        ::Sleep(1000);
    }
}

Это, конечно, только концепция, по хорошему надо без бесконечного цикла и слипов сделать, но для того, что бы точно узнать, когда окно создано, придется либо ставить хуки через SetWindowsHookEx, либо ставить хуки на api, а пример выше определяет hwnd без всяких модификаций.

Редактирования нет( Вынесите пожалуйста сообщение после фрагмента кода из тега, а еще лучше, добавьте тег для C/C++ кода, хотя, конечно возможно, что я его просто не нашел.
 
Последнее редактирование модератором:
Назад
Сверху Снизу